diff options
689 files changed, 14039 insertions, 753 deletions
diff --git a/.gitattributes b/.gitattributes index 7282c9e61b1..0b87a97df9c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ +VERSION merge=ours Dangerfile gitlab-language=ruby db/schema.rb merge=merge_db_schema diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b3b6beb1068..0d573a4c214 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,4 +42,3 @@ include: - local: .gitlab/ci/setup.gitlab-ci.yml - local: .gitlab/ci/test-metadata.gitlab-ci.yml - local: .gitlab/ci/yaml.gitlab-ci.yml - - local: .gitlab/ci/ee-specific-checks.gitlab-ci.yml diff --git a/.gitlab/ci/ee-specific-checks.gitlab-ci.yml b/.gitlab/ci/ee-specific-checks.gitlab-ci.yml deleted file mode 100644 index babb89b4606..00000000000 --- a/.gitlab/ci/ee-specific-checks.gitlab-ci.yml +++ /dev/null @@ -1,22 +0,0 @@ -.ee-specific-check: - extends: .default-tags - dependencies: [] - only: - - branches@gitlab-org/gitlab-ee - except: - - master - - tags - - /[\d-]+-stable(-ee)?/ - - /[\d-]+-auto-deploy-\d{7}/ - - /^security-/ - - /\bce\-to\-ee\b/ - -ee-files-location-check: - extends: .ee-specific-check - script: - - scripts/ee-files-location-check - -ee-specific-lines-check: - extends: .ee-specific-check - script: - - scripts/ee-specific-lines-check diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 878be25c39b..a1ed0b102c9 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -8,6 +8,11 @@ - master@gitlab/gitlabhq - master@gitlab/gitlab-ee +.only-gitlab-ee: + only: + - branches@gitlab-org/gitlab-ee + - tags@gitlab-org/gitlab-ee + .rake-exec: extends: - .default-tags @@ -231,7 +236,7 @@ db:migrate-from-v11.11.0: variables: SETUP_DB: "false" script: - - git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v11.11.0 + - git fetch https://gitlab.com/gitlab-org/gitlab-ee.git v11.11.0-ee - git checkout -f FETCH_HEAD - sed -i "s/gem 'oj', '~> 2.17.4'//" Gemfile - sed -i "s/gem 'bootsnap', '~> 1.0.0'/gem 'bootsnap'/" Gemfile @@ -314,3 +319,135 @@ coverage: - coverage/index.html - coverage/assets/ - tmp/memory_test/ + +## EE-specific content +.rspec-base-ee: + extends: + - .rspec-base + - .only-gitlab-ee + script: + - JOB_NAME=( $CI_JOB_NAME ) + - TEST_TOOL=${JOB_NAME[0]} + - TEST_LEVEL=${JOB_NAME[1]} + - DATABASE=${JOB_NAME[2]} + - export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${TEST_TOOL}_${TEST_LEVEL}_${DATABASE}_ee_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json + - export KNAPSACK_GENERATE_REPORT=true KNAPSACK_LOG_LEVEL=debug KNAPSACK_TEST_DIR=spec + - export CACHE_CLASSES=true + - cp ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH} + - scripts/gitaly-test-spawn + - date + - 'export KNAPSACK_TEST_FILE_PATTERN=$(ruby -r./lib/quality/test_level.rb -e "puts Quality::TestLevel.new(%(ee/)).pattern(:${TEST_LEVEL})")' + - mkdir -p tmp/memory_test + - export MEMORY_TEST_PATH="tmp/memory_test/ee_${TEST_TOOL}_${TEST_LEVEL}_${DATABASE}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_memory.csv" + - knapsack rspec "--color --format documentation --format RspecJunitFormatter --out junit_rspec.xml --tag level:${TEST_LEVEL} --tag ~geo" + - date + +.rspec-base-pg-ee: + extends: .rspec-base-ee + services: + - name: postgres:9.6 + command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] + - name: redis:alpine + - name: docker.elastic.co/elasticsearch/elasticsearch:5.6.12 + +rspec unit pg ee: + extends: .rspec-base-pg-ee + parallel: 7 + +rspec integration pg ee: + extends: .rspec-base-pg-ee + parallel: 3 + +rspec system pg ee: + extends: .rspec-base-pg-ee + parallel: 5 + +.rspec-base-pg-geo: + extends: + - .rspec-base + - .only-gitlab-ee + script: + - JOB_NAME=( $CI_JOB_NAME ) + - TEST_TOOL=${JOB_NAME[0]} + - TEST_LEVEL=${JOB_NAME[1]} + - DATABASE=${JOB_NAME[2]} + - export KNAPSACK_TEST_FILE_PATTERN="ee/spec/**{,/*/**}/*_spec.rb" KNAPSACK_GENERATE_REPORT=true CACHE_CLASSES=true + - export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${TEST_TOOL}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json + - cp ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH} + - source scripts/prepare_postgres_fdw.sh + - scripts/gitaly-test-spawn + - mkdir -p tmp/memory_test + - export MEMORY_TEST_PATH="tmp/memory_test/ee_${TEST_TOOL}_${TEST_LEVEL}_${DATABASE}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_memory.csv" + - knapsack rspec "-Ispec --color --format documentation --format RspecJunitFormatter --out junit_rspec.xml --tag geo" + +rspec geo pg ee: + extends: + - .rspec-base-pg-geo + - .use-pg + - .except-docs-qa-geo + parallel: 3 + +rspec geo pg-10 ee: + extends: + - .rspec-base-pg-geo + - .use-pg-10 + - .except-docs-qa-geo + parallel: 3 + +quick-rspec geo pg ee: + extends: + - .rspec-base-pg-geo + - .use-pg + stage: quick-test + only: + - /(^geo[\/-].*|.*-geo$)/ + +quick-rspec geo pg-10 ee: + extends: + - .rspec-base-pg-geo + - .use-pg-10 + stage: quick-test + only: + - /(^geo[\/-].*|.*-geo$)/ + +rspec quarantine pg ee: + extends: rspec quarantine pg + script: + - export NO_KNAPSACK=1 CACHE_CLASSES=true + - scripts/gitaly-test-spawn + - bin/rspec --color --format documentation --format RspecJunitFormatter --out junit_rspec.xml --tag quarantine -- ee/spec/ + +migration:upgrade-pg-ce-to-ee: + extends: + - .default-tags + - .default-retry + - .default-cache + - .default-before_script + - .use-pg + - .except-docs-qa + dependencies: ["setup-test-env"] + variables: + SETUP_DB: "false" + script: + - ruby -r./scripts/ee_specific_check/ee_specific_check -e'EESpecificCheck.fetch_remote_ce_branch' + - git checkout -f FETCH_HEAD + - . scripts/utils.sh + - . scripts/prepare_build.sh + - date + - setup_db + - date + - git checkout -f $CI_COMMIT_SHA + - date + - . scripts/prepare_build.sh + - date + - bundle exec rake db:migrate + +db:rollback geo: + extends: + - db:rollback + - .only-gitlab-ee + script: + - bundle exec rake geo:db:migrate VERSION=20170627195211 + - bundle exec rake geo:db:migrate + +## END of EE-specific content diff --git a/.gitlab/ci/test-metadata.gitlab-ci.yml b/.gitlab/ci/test-metadata.gitlab-ci.yml index b9dac64957e..a04f67e4c43 100644 --- a/.gitlab/ci/test-metadata.gitlab-ci.yml +++ b/.gitlab/ci/test-metadata.gitlab-ci.yml @@ -26,6 +26,8 @@ retrieve-tests-metadata: - mkdir -p rspec_profiling/ - wget -O $FLAKY_RSPEC_SUITE_REPORT_PATH http://${TESTS_METADATA_S3_BUCKET}.s3.amazonaws.com/$FLAKY_RSPEC_SUITE_REPORT_PATH || rm $FLAKY_RSPEC_SUITE_REPORT_PATH - '[[ -f $FLAKY_RSPEC_SUITE_REPORT_PATH ]] || echo "{}" > ${FLAKY_RSPEC_SUITE_REPORT_PATH}' + - wget -O $EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH http://${TESTS_METADATA_S3_BUCKET}.s3.amazonaws.com/$EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH || rm $EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH + - '[[ -f $EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH ]] || echo "{}" > ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH}' update-tests-metadata: extends: .tests-metadata-state @@ -41,6 +43,9 @@ update-tests-metadata: - echo "{}" > ${KNAPSACK_RSPEC_SUITE_REPORT_PATH} - scripts/merge-reports ${KNAPSACK_RSPEC_SUITE_REPORT_PATH} knapsack/${CI_PROJECT_NAME}/rspec_*_pg_node_*.json - '[[ -z ${TESTS_METADATA_S3_BUCKET} ]] || scripts/sync-reports put $TESTS_METADATA_S3_BUCKET $KNAPSACK_RSPEC_SUITE_REPORT_PATH' + - echo "{}" > ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH} + - scripts/merge-reports ${EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH} knapsack/${CI_PROJECT_NAME}/rspec_*_pg_ee_*node_*.json + - '[[ -z ${TESTS_METADATA_S3_BUCKET} ]] || scripts/sync-reports put $TESTS_METADATA_S3_BUCKET $EE_KNAPSACK_RSPEC_SUITE_REPORT_PATH' - rm -f knapsack/${CI_PROJECT_NAME}/*_node_*.json - scripts/merge-reports ${FLAKY_RSPEC_SUITE_REPORT_PATH} rspec_flaky/all_*_*.json - FLAKY_RSPEC_GENERATE_REPORT=1 scripts/prune-old-flaky-specs ${FLAKY_RSPEC_SUITE_REPORT_PATH} diff --git a/.gitlab/issue_templates/Feature proposal.md b/.gitlab/issue_templates/Feature proposal.md index 68f60cb52d4..2d6d03c313c 100644 --- a/.gitlab/issue_templates/Feature proposal.md +++ b/.gitlab/issue_templates/Feature proposal.md @@ -43,6 +43,10 @@ If this feature requires changing permissions, this document https://docs.gitlab <!-- Define both the success metrics and acceptance criteria. Note that success metrics indicate the desired business outcomes, while acceptance criteria indicate when the solution is working correctly. If there is no way to measure success, link to an issue that will implement a way to measure this. --> +### What is the type of buyer? + +<!-- Which leads to: in which enterprise tier should this feature go? See https://about.gitlab.com/handbook/product/pricing/#four-tiers --> + ### Links / references /label ~feature diff --git a/.license_encryption_key.pub b/.license_encryption_key.pub new file mode 100644 index 00000000000..68f241b9741 --- /dev/null +++ b/.license_encryption_key.pub @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Hxv3MkkZbMrKtIs6np9 +ccP4OwGBkNhIvhPjcQP48hbbascv5RqsOquQGrYSD2ZrE/kbkRdkIcoHEeTZLif+ +bDKFZFI7o5x0H92o9/GSvxHJhQ8mkmvwxD7lssGShwZEm8WG+U7BZqUV/gGmCDqe +9W8H8Fq2B0ck8IXjbQ4Zz+JlyV/NHZTZcs69plFiLKh4N6GYVftOVwSomh0bbypP +OB9WnLC7RC9a2LRrhtf8sqa2rRFmtyMMfgFFzLMzS+w+1K4+QLnWP1gKQVzaFnzk +pnwKPrqbGFYbRztIVEWbs8jPYlLkGb8ME4C84YVtQgbQcbyisU/VW3wUGkhT+J0k +xwIDAQAB +-----END PUBLIC KEY----- diff --git a/.rubocop.yml b/.rubocop.yml index 73743ebf9a2..693ee0ae847 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -275,8 +275,15 @@ RSpec/BeSuccessMatcher: - 'ee/spec/support/shared_examples/controllers/**/*' - 'spec/support/controllers/**/*' - 'ee/spec/support/controllers/**/*' + Scalability/FileUploads: Enabled: true Include: - 'lib/api/**/*.rb' - 'ee/lib/api/**/*.rb' + +Graphql/Descriptions: + Enabled: true + Include: + - 'app/graphql/**/*' + - 'ee/app/graphql/**/*' diff --git a/CHANGELOG-EE.md b/CHANGELOG-EE.md new file mode 100644 index 00000000000..544033aea1e --- /dev/null +++ b/CHANGELOG-EE.md @@ -0,0 +1,5092 @@ +Please view this file on the master branch, on stable branches it's out of date. + +## 12.2.5 + +### Security (1 change) + +- Do not allow creation of projects from group templates if project is not descendant of that group. + + +## 12.2.4 + +### Fixed (1 change) + +- Fix group hooks not firing in PostReceive. !15598 + + +## 12.2.3 + +### Security (2 changes) + +- Limit number of jobs in running pipelines for the past hour on per plan basis. !1182 +- Filter out old system notes for epics in notes api endpoint response. + + +## 12.2.2 + +### Security (2 changes) + +- Limit number of jobs in running pipelines for the past hour on per plan basis. !1182 +- Filter out old system notes for epics in notes api endpoint response. + + +## 12.2.1 + +- No changes. + +## 12.2.0 + +### Security (5 changes) + +- Gate MR head_pipeline behind read_pipeline ability. +- Queries for Upload should be scoped by model. +- Grant admin note permissions in epics for maintainers and owners. +- Fix bypass email verification when SCIM user is created via API. +- Do not allow localhost urls in GitHub Integration. + +### Removed (1 change) + +- Removes support for matching on app label for Kubernetes deploy boards, terminals, and pod logs. !14020 + +### Fixed (67 changes, 2 of them are from the community) + +- Fix error when creating issues in scoped boards. !11080 +- Resolve Snowplow tracking for notes does not work in Firefox. !12578 +- Fix License App user count for ultimate. !14055 +- Enable incremental elasticsearch index updates for wikis. !14057 +- Ensure U2F javascript runs on GroupSAML callback. !14262 +- Fix to allow adding multiple instance-level clusters. !14270 +- Initialize chart data in same order as config. !14283 +- Make side-nav expanded when on dependency list. !14314 +- Add anchor to learn-more-button on the dependency list page so it links to the right location in the docs. !14316 +- Un-block UI interactions while Code Quality MR widget is loading. !14323 +- Enforce SSO on subgroups and projects. !14364 +- Fix race condition on merge train that it cannot process merge request sometimes. !14386 +- Fix MWPS/ADMTWPS system notes shows wrong sha. !14397 +- Show position of merge trains in system notes. !14398 +- Respect limited indexing when importing projects. !14413 +- replace dropdown in project cards in Operations Dashboards with a remove icon. !14419 +- Allow blank values for IP restriction setting. !14427 +- Fix weight quick action to support 0 value. !14432 +- Fix cluster health charts on instance level. !14440 +- Fix on_environment scope to not re-order whole query. !14481 +- Tick instance runner after customer purchases additional CI minutes. !14494 +- Fix race condition of `refs/merge` competing overwrite. !14495 +- Fix 'learn more'-link on dependency page. !14496 +- Allow subgroups to use their parent group's custom project templates. !14499 +- Support creating/publishing drafts with commit ID. !14520 +- Do not include milestone attribute when promoting issue to epic. !14532 +- Include Subgroups in Contribution Analytics calcualtions. !14536 +- Fix GeoNode#name backward compatibility. !14564 +- Starting a new discussion only on line without Draft note created on it. !14569 +- Fix reply to discussion on promoted epic. !14576 +- Fix UI breaking on forms on Bootstrap Grid system. !14581 (Takuya Noguchi) +- Geo - Show why node is unhealthy in the rake task to check the health of the secondary node. !14615 +- Fix displaying feature flag names in the audit log. !14621 +- Support emails as ID in SCIM. !14625 +- Fix negative values in burndown charts. !14632 +- Fixes #12780 by avoiding incorrect cached values. !14651 +- Avoid Design Management thumbnails from being distorted/stretched. !14670 +- Support 0 weight in issue sidebar. !14683 +- Adds a downard chevron to Dashboards icon in the header. !14711 +- Handling use case for repeat trial. !14714 +- Fix suggested namespace in deploy boards help text. !14739 +- Fix duplicated issues while sorting by weight. !14750 (Vasiliy Yaklushin) +- Resolve Make sure not to redirect to the onboarding welcome page on mobile devices. !14842 +- Fix Jira DVCS integration not working when project name has dots. !14855 +- Fix the Epics filter bar alignment. !14857 +- Fix max attachment size used in CSV export email messages. !14884 +- Fix issue that caused the "Merge Immediately" option not to be available when merge trains were enabled. !14894 +- Fix error fetching project security dashboard data for maintainers with access to a project but not to its group & fix routing error for project security dashboard for projects not in a group. !14896 +- fix: operation dashboard delete icon tooltip title. !14899 +- Improve help text and docs about custom metrics. !14912 +- Geo - Disable built-in Sidekiq retry for verification workers. !14946 +- Remove visual review app feature flag. !14958 +- Geo - Warn when reusing an existing tracking database. !14981 +- Fix min approvals required for new MR rules. !14988 +- Fix admin notes internationalization text. !15001 +- Batching minutes reset queries to avoid query timeouts. !15002 +- Only show a pull mirror if mirroring is actually enabled. !15049 +- Update epic dates when creating an issue that adds the epic using commands. !15062 +- Show correct historic max user count for a license. !15107 +- Fix job scheduling when extra CI minutes purchased and minutes usage is above application shared Runners minutes limit. !15120 +- Skip ES commit results for deleted projects. !15236 +- Align "New metric" page title correctly to the rest of the page. !15259 +- Bypass push rules for merge to ref service. +- Ensure LDAP Group Sync by Filter normalizes DNs. +- Add support for partial approval in chat message merge request event handler. +- Insights: Only display page config with valid values. +- Shrink empty/loading states for cluster health charts. + +### Changed (33 changes, 2 of them are from the community) + +- Update merge requests section description text on project settings page. !11098 +- First pass at auto remediation changes. !12010 +- Create incident issues by default for alerts. !12814 +- Resolve Move approval user password input from inline to a modal. !14123 +- Add Copy to Clipboard Button to Review App Modal. !14290 +- Remove "Allow merge trains" option from project settings page. !14429 +- Change epics reordering to not update timestamps. !14441 +- Remove feature flag behind MR's multiple assignees. !14506 +- Prioritize mirrors for CI over other mirrors. !14575 +- Move external authorization service API management to EE. !14598 +- Improve default title and description of issues opened from managed Prometheus alerts. !14614 +- Add 'Security & Compliance' as top-level navigation item to the project-sidebar. !14628 +- Add "Security" as nav-item to group-view sidebar. !14639 +- MVC: Group and User Billing Page Improvement - Avatar and Name. !14660 (Ammar Alakkad) +- Geo: Increase HTTP read timeout of proxy requests to 60 s. !14671 +- Show threshold in incident title for gitlab alerts. !14688 +- Expose licence management reports comparison. !14723 +- Move metrics alerts form to modal. !14760 +- Add new documentation and link for automating Visual Review feedback. !14789 +- Expose licence management report for pipeline. !14796 +- Present container scanning report comparison via API. !14898 +- Allow approvals_required to be lower than project. !14902 +- Rename snowplow_collector_uri to snowplow_collector_hostname. !14963 +- Remove duplicated 'New metric' button in prometheus configuration. !14964 +- Remove validation of MR level approval rules in merge requests. !14968 +- Add missing merge request committer approval setting to API. !15019 (jramsay) +- Move dependency scanning comparision logic to backend. !15023 +- Update permissions for Dependency List. !15044 +- Dependency List Job Failed Alert - Hide link to job if payload from API does not include 'job_path'. !15068 +- Use vulnerability message on Dependency list. !15125 +- Rename License Management to License Compliance. !15163 +- Elasticsearch: index snippet content only up to 1 MB. !15215 +- Add note count, updated timestamp, and closed tag to epics list view. + +### Performance (9 changes) + +- Remove support for checking legacy security reports. !14291 +- Cache Geo checks for a certain time period instead of per request. !14513 +- Cache vulnerability history per project. !14619 +- Fix N+1 queries in vulnerabilities API. !14638 +- Improve Elasticsearch database import by retrying only failed cases first. !14657 +- Refactor feature flag scopes for_unleash_client. !14768 +- Split MR widget into cached and non-cached serializers. !15045 +- Geo: Don't wait when exiting the log cursor. !15070 +- Geo: Improve performance of clean up worker for selective sync. + +### Added (60 changes, 1 of them is from the community) + +- Enabled setting the Security Dashboard as a default view for groups. !7889 +- Paginate license management. !10983 +- Allows any user to comment on a dismissed vulnerability. !12067 +- Enable security gates for merge requests. !13109 +- Enable deployment boards and pod logs for instance and group clusters. !13307 +- Support for blocking merge requests. !13506 +- Add the ability to publish and install NPM packages from groups and subgroups. !13986 +- Expose saml_provider_id in the users API. !14045 +- Allow adding groups to CODEOWNERS file. !14071 +- Add group packages page. !14089 +- Add merge train helper text to merge request widget. !14097 +- Support remapping of Git repos via SSH with project aliases. !14108 +- Allow bulk editing group issues. !14141 +- Expose reject_unsigned_commits option via the API. !14165 +- Add instance level analytics. !14173 +- Show design boards at previous versions. !14292 +- Build cascading train refs for parallel execution of Pipelines for merge trains. !14296 +- Add notifications for CI Minutes quota limit approaching. !14328 +- Require session with smartcard login for Git access. !14368 +- Add analytics top navigation link. !14377 +- Add Quick Actions for adding/removing epic parent relations. !14451 +- Geo: Validate file transfers (attachments, LFS objects, artifacts). !14477 +- Create system notes for scoped labels. !14487 +- Show deploy boards for group cluster deployments. !14504 +- Support feature flag gradualRolloutUserId strategy on backend. !14515 +- Add percentage rollout support to feature flag UI. !14538 +- Added new Design Management feature for GitLab Premium. With Design Management, you can upload design assets to issues and view them all together to easily share and collaborate with your team. !14582 +- Add Ability to Enable Feature Flags by User ID. !14596 +- Add ability to view different design versions. !14601 +- Allow bulk editing group merge request milestones. !14616 +- Add cycle analytics on group level. !14627 +- Resolve Add point of interest discussions to designs. !14648 +- Limit creation of the Alert Bot in usage ping. !14649 +- Audit strategies for feature flag scopes. !14652 +- Read and write User Admin notes via API. !14662 +- Add date range dropdown for Analytics. !14681 +- Allow auditors to see the group and project security dashboards. !14695 +- Add `Incident` label to issues created by the Alert Bot. !14705 +- Merge vulnerabilities data into Dependency List report. !14706 +- Support an alert template field to allow for incident customization. !14710 +- Add a rake task to run a LDAP group sync. !14735 (Harish Ramachandran and Cindy Pallares) +- Log impersonation actions in audit log. !14740 +- Support feature flag userWithId strategy on backend. !14752 +- Add vulnerabilities to dependency list. !14761 +- Add project download & project export audit events. !14775 +- Count design usage, in order to meet SMAU OKR. !14779 +- Support multiple sites in DAST reports. !14787 +- Allow adding email domain to group to limit users to ones with email in this particular domain. !14800 +- Allow global search on comments. !14818 +- Add filtering by vulnerabilities to Dependency List. !14825 +- Support for bulk editing labels at a group level. !14827 +- Add an Upgrade button to Group's billings page. !14849 +- Add authorization to the dependency list. !14867 +- Add cycle analytics on a group level - FE. !14891 +- Add Dependency Scanning information to the Dependency List. !14955 +- Tweak Geo node form text. !14957 +- Geo: Make Object Storage synchronization in Geo Nodes configurable via Admin UI. !15000 +- Enable security report approvals by default. !15087 +- Add Collapse buttons to Operations settings. !15117 +- Geo: Support replication for Docker container registries. !15135 + +### Other (19 changes, 2 of them are from the community) + +- Update License Management section information under CI/CD settings. !4295 +- Adds a popover to vulnerability-check approvals. !14038 +- Show warning for deploy boards if legacy app label is used. !14103 +- Change spelling of wildcare to wildcard on feature flag new and edit forms. !14171 +- Rename `TOKEN_TYPES` to `USER_TOKEN_TYPES`. !14209 (Arun Kumar Mohan) +- Improved dependency proxy page with some small UI enhancements. !14448 +- Replace 'JIRA' with 'Jira' for EE-specific code comments. !14479 (Takuya Noguchi) +- Remove unused EE::GitPushService. !14483 +- Improved project level navigation for package features. !14492 +- Add Ability to Remove Projects From the Envivonment Dashboard. !14563 +- Increase rate at which UpdateAllMirrorsWorker schedules jobs and reschedules itself. !14573 +- Cleaned up package list icons to improve consistency inside package section. !14607 +- Limit width for onboarding popovers. !14641 +- Updates the security dashboard documentation link. !14669 +- Add counter columns to geo_node_statuses database table. !14943 +- Geo - Rename recheck actions to reverify. !14979 +- Remove deprecated name sast_container from licensed features. !14980 +- Remove default relative_position from epic_issues. !15008 +- Fix alignment of activity dropdown in epic tabs; add counter to discussion tab. + + +## 12.1.5 + +- No changes. + +## 12.1.4 + +### Fixed (3 changes) + +- Don't send CI usage email notifications when quota is unlimited. !14810 +- Fix variable mismatch in code quality widget. !14829 +- Change package validation scope to fix Maven package naming functionality. !14922 + + +## 12.1.3 + +### Fixed (3 changes) + +- Allow bulk editing group issues for reporter access level and higher. !14744 +- Initialize Application Table on Instance-wide Cluster Details. !14749 +- Hide "Buy additional minutes" button for self-managed installs. !14826 + +### Added (4 changes) + +- Add Vulnerabilities API scoping: pipeline. !14376 +- Add policy for accessing dependencies. !14561 +- Add filtering by package manager for dependencies. !14562 +- Add dependency list public endpoint. !14612 + + +## 12.1.2 + +### Security (1 change) + +- Ensure the Insights configuration project is part of the group and is accessible to the current user. + +### Security (6 changes) + +- Don't override approval rules if not allowed. +- Grant admin note permissions in epics for maintainers and owners. +- Queries for Upload should be scoped by model. +- Fix bypass email verification when SCIM user is created via API. +- Prevent an XSS vector in the add approver email. +- Make vulnerability feedback invisible if limited access to repo. + + +## 12.1.1 + +### Fixed (1 change) + +- Don't send CI usage email notifications for self-hosted instances. !14809 + + +## 12.0.7 + +### Security (3 changes) + +- Limit number of jobs in running pipelines for the past hour on per plan basis. !1182 +- Queries for Upload should be scoped by model. +- Filter out old system notes for epics in notes api endpoint response. + + +## 12.0.6 + +- No changes. + +## 12.0.2 (2019-06-25) + +### Fixed (1 change) + +- Take into account events created before milestone start. !14184 + + +## 12.0.1 (2019-06-24) + +- No changes. + +## 12.0.0 (2019-06-22) + +### Security (2 changes) + +- Filter relative links in wiki for XSS. +- Fix XSS in Ancestor tooltip title. + +### Removed (2 changes) + +- Remove old approver system in favor of new approval rule system. !12436 +- Geo: Remove deprecated wikis_count and repositories_count fields from the public API. !13025 + +### Fixed (36 changes, 1 of them is from the community) + +- Group SAML identities cleaned up when leaving a group. !5817 +- Make root relative URLs clickable in vulnerability modal. !9767 +- Make burndown chart timezone aware. !10328 +- Prevent files paths from overflowing in vulnerability info modal. !10606 +- Fixed a bug where removing related issues could get stuck. !12316 +- Fix anchor link in UI. !12737 +- Add feature flag to group_scim javascript. !13078 +- Geo - Enable Cron job to perform repository checks on a Geo secondary node. !13103 +- Restrict child_epic and remove_child_epic quick actions when using mysql. !13152 +- Disable licenses_app feature flag by default. !13291 +- Fix security dashboard errors on IE11. !13319 +- Respect limited indexing settings in rake tasks. !13437 +- Geo - Does not redirect user to the custom home page URL on a Geo secondary. !13447 +- Use quarantine size to check push size against repository size limit. !13460 +- Fix SSO Enforcement when used with 2FA. !13473 +- Fix Git over HTTP when using SAML SSO Enforcement. !13485 +- Only use elasticsearch when it is enabled. !13495 +- Add referenced-commands in no overflow list. !13550 +- Hide action buttons while security dashboard is loading. !13576 +- Fix alignment of label for admin notes on admin. !13592 (Takuya Noguchi) +- Use elasticsearch go indexer for wikis. !13743 +- Handle case where site property is an array in DAST report. !13775 +- Fix dast report parsing regression caused by change in zaproxy. !13789 +- Fix port validation in .gitlab-webide.yml. !13846 +- Fix "rule_type does not exist" error during consume_remaining_migrate_approver_to_approval_rules_in_batch_jobs migration. !13947 +- Hide operations nav icon for small screens. !13960 +- Remove free user info from non-ultimate license. !14010 +- Use fallback approval rule if no eligible rules exist. !14042 +- Fix 'Group > Usage Quota' menu item. !14043 +- Fix incorrect epic ancestor links. !14092 +- Show Usage Quotas regardless of namespace subscription. !14135 +- Fix calculation of used extra CI minutes. !14217 +- Remove class hiding spinner in board switcher. +- Fix broken filter by approvers. +- Remove extra spaces in MR list view approval counts. +- Remove extra border on tracing empty state page. + +### Changed (18 changes) + +- Allow merge requests to be merged even when it does not have up-to-date pipeline when merge request pipeline is enabled. !12309 +- Migrate code_owners to rule_type enum on approval_merge_request_rules. !13036 +- Avoid failing pull mirroring if LFS import fails. !13133 +- Updates Pipeline Quota page to accomodate for Storage Quotas. !13139 +- Align group and project level security dashboard UX. !13180 +- Remove shared_runner_minutes_on_root_namespace feature flag. !13208 +- Enable dependency proxy per group by default. !13574 +- Move dependencies API endpoint to "security" namespace. !13897 +- Allow developers to configure dependency proxy. !13899 +- Use real data in `:project/security/dependencies` endpoint. !13906 +- Use bulk-indexing API for project associations. !13917 +- Update response schema for DependencyList endpoint and add status. !13918 +- Geo - Make foreign data wrapper a hard requirement. !13940 +- Polish SAML SSO configuration page. !13982 +- Make Insights Generally Available. !14067 +- Automatically index wikis in elasticsearch. !14095 +- Require Hashed Storage to be enabled to create new Geo Nodes. !14102 +- Changes to default insights charts. + +### Performance (7 changes) + +- Omit page counts in admin audit logs. !1306 +- Improve scheduling of mirror updates to reduce frequency of database queries. !11217 +- Limit count to improve query performance. !12231 +- Avoid loading database objects for Elasticsearch results. !12691 +- Avoid hitting Elasticsearch more than once on search. !13120 +- Add index to count pending mirror updates. !13901 +- Performance improvement when loading epics list. !13904 + +### Added (34 changes, 1 of them is from the community) + +- Provide application-wide LDAP membership lock setting. !4354 +- Added a "Require user password to approve" option on projects for merge request approvals to enable compliance in FDA regulated fields". !10364 (James Davila, Paul Knopf, Greg Smethells) +- Add "Allow merge trains" option to project settings page. !10803 +- Add optional reason when dismissing vulnerabilities. !11226 +- System notes for adding and removing epic relationships. !11416 +- Show if user is using a license seat on admin user page. !11449 +- Allow merge requests to block other MRs from being merged. !11600 +- SSO enforement redirects to group sign in when not using SAML. !12246 +- When a merge request is blocked by other unmerged merge requests, display them on the show page of a merge request. !12357 +- Group SAML can be used to sign into a GitLab instance. !12660 +- IP address restriction for groups. !12669 +- Make the number of Elasticsearch shards and replicas configurable. !12713 +- Add quick actions for adding and removing child epic relations to epic. !12772 +- Adds a confidence filter to the Group Security Dashboard. !12805 +- Expose Design blobs through GraphQL. !13037 +- Expand pipeline variables passed downstream. !13197 +- Add support for querying epics with GraphQL. !13248 +- Add Merge Train auto merge strategy. !13278 +- Adds Storage Counter. !13294 +- Allow design blobs to be stored in Git LFS. !13389 +- JIT users provisioning for group SAML. !13552 +- Add Ability for Maintainers to Rotate Instance Id in Feature Flags. !13722 +- Notify users when their CI minutes quota has run out. !13735 +- Use Flipper as an A/B testing framework. !13755 +- [New Auto Merge Strategy] Add To Merge Train When Pipeline Succeeds. !13767 +- Add `dependency_list` report. !13900 +- Add admin form to enforce a pipeline on an instance. !13923 +- Count usage of DependencyList endpoint. !13962 +- Add preliminary Dependency List frontend implementation. !13968 +- Add Admin settings to disable project deletion. !14002 +- Usage ping: Track amount of incident issues. !14013 +- Sync file changes from Web IDE to Web Terminal. !14035 +- Add report_approver to approval_merge_request_rules. !14050 +- Add merge train position message under pipeline in merge request widget. !14064 + +### Other (9 changes, 2 of them are from the community) + +- New user flow for SSOing into a GitLab.com group. !10338 +- Improve vulnerability API. !12760 (Robert Schilling) +- Add action popover component for user onboarding. !13346 +- Add help content popover component for user onboarding. !13363 +- Expose services in the web ide terminal entity. !13665 +- Rename boards spec name. !13725 (George Tsiolis) +- Fix typos in i18n strings for onboarding tour. !14153 +- Externalize strings of chat page in user profile. !28632 +- Remove commit count from storage quotass. + + +## 11.11.8 + +- No changes. + +## 11.11.7 + +### Security (5 changes) + +- Don't override approval rules if not allowed. +- Grant admin note permissions in epics for maintainers and owners. +- Prevent an XSS vector in the add approver email. +- Ensure the Insights configuration project is part of the group and is accessible to the current user. +- Make vulnerability feedback invisible if limited access to repo. + + +## 11.11.4 (2019-06-26) + +### Fixed (1 change) + +- Use quarantine size to check push size against repository size limit. !14269 + + +## 11.11.3 (2019-06-10) + +### Fixed (1 change) + +- Fix create mr from vuln modal regression. !13524 + + +## 11.11.2 (2019-06-04) + +### Performance (1 change) + +- Geo - Does not apply selective sync restrictions while counting registries on the tracking database. !13257 + + +## 11.11.0 (2019-05-22) + +### Security (1 change) + +- Destroy project remote pull mirrors instead of disabling. !10355 + +### Fixed (26 changes) + +- Add missing endpoint for user information to GitHub API. !10482 +- Remove slack slash commands double up. !10555 +- Display Scoped Labels on Issue Board. !10669 +- Ensure custom group template feature is available only for groups on gold and silver. !10678 +- Fix removing and updating insights config, and foreign key constraints. !11030 +- Geo: Fix broken button to delete orphaned upload registries through Admin. !11156 +- Resolve: Epic labels in system notes point to the epic itself. !11234 +- Geo: Fix: Project sync failures usually double-increment *_retry_count. !11381 +- Fix unauthenticated GET of public Epics API. !11485 +- Hide ScopedBadge overflow notes. !11548 +- Fixes a CI failure in jest. !11586 +- Fix error when reordering/deleting subgroup epics. !11837 +- Fix some filter bar tokens not showing up when multiple assignees are enabled. !11939 +- Geo: Fix OAuth authentication with relative URLs. !11976 +- Fix for not being able to remove the last namespace/project from elasticsearch limited namespaces/projects. !11989 +- Fix approvals project settings section when merge requests disabled. !12070 +- Enable alert bot to use quick actions. !12127 +- Geo: Remove counts over geo_event_log table. !12146 +- Geo: Prevent RegistryFinder calls on the primary. !12183 +- Fix placement of LDAP icon in members list. !12304 +- Use path instead of a URL for accessing approval settings. !12414 +- Remove non-semantic use of `.row` in member listing controls. !12466 +- Force tag overwrite on mirror update. !12491 +- Fixes the feedback paths on the project security dashboard. !12849 +- Fixed starting a review on images. +- Fix updating board attributes through API. + +### Changed (13 changes) + +- Group SAML enforcement requires active SSO session for group access. !10034 +- Geo: Rename "Disable" to "Pause|Resume" (Admin > Geo Nodes). !10297 +- Upgrade group security dashboard to use gitlab-ui line chart. !10479 +- Geo - Implement selective sync support for the LFS objects FDW queries. !10757 +- Documentation : Improve selective sync documentation. !11072 +- Geo: Implement selective sync support for the FDW queries to count the number of attachments to sync. !11107 +- Allowing Elasticsearch indexing gap recovering. !11408 +- Geo - Implement selective sync support for the FDW queries to count attachments. !11518 +- Geo - Implement selective sync support for the FDW queries to find attachments. !11544 +- Geo - Add selective sync support for the job artifacts FDW queries. !11892 +- Fetch all available groups when creating MR approval rule. !12096 +- SSO enforcement requires active SAML session for web access to project resources. !12109 +- Perform LDAP group sync on sign in only for new users. + +### Performance (3 changes) + +- Swap conditions to reduce frequency of database query. !11217 +- Add index for mirror_user_id to projects table. !11422 +- Geo - Improve performance of the selective sync cleanup worker. !11998 + +### Added (27 changes, 2 of them are from the community) + +- Proxy websocket requests to build services. !9723 +- Add dependency proxy for containers. !9750 +- Added gitlab:elastic:projects_not_indexed rake task. !9854 (Jason Colyer) +- Added Snowplow tracking to notes. !10104 +- Support multiple assignees for merge requests. !10161 +- Add UI to enable/disable a dependency proxy on a group level. !10386 +- Let the GitLab Alert bot open incident issues. !10460 +- Remove feature flag `:incident_management`. !10569 +- Allow multiple secondary nodes behind a load balancer. !10755 +- Copy LFS objects from pull mirror. !10779 +- Geo: Inform users about current replication lag in the UI on secondaries. !10807 +- Autosave description in epics. !10844 +- Keep track of packages_file in ProjectStatistics. !11020 +- Adds a dismissal item to the vulnerability modal. !11028 +- Add project level config for merge train. !11065 +- Support pie charts in Insights. !11186 +- Create ActiveRecordModel and table for Merge Train feature. !11204 +- Allow adding GitLab license at installation time. !11244 +- Added ZAP Full Scan support for DAST. !11269 +- Add created_at and updated_at filters to Epics API. !11315 (jramsay) +- Add API to retrieve security vulnerabilities. !11539 +- Basic Rails implementation for BOM. !11613 +- Add Frontend Store and UI For Environments Dashboard MVC. !11702 +- Track clicks on uninstall button for kubernetes implementation. !12048 +- Add Vulnerabilities API scoping: severity, confidence, and dismissal. !12076 +- Alert users that protected environments affects feature flags. !12168 +- Support creating a new child epic from the API. + +### Other (8 changes, 1 of them is from the community) + +- Improve project settings page layout and UX. !10388 +- Uses the more explicit vulnerability feedback endpoints on the front end. !10461 +- Automatically enable multiple MR assignees feature flag. !10558 +- Move geo_log_cursor binary to the ee folder. !10821 +- Move sidekiq-cluster to ee/bin. !11001 +- Move ee-specific code from boards/components/issue_card_inner.vue. !11032 (Roman Rodionov) +- Make all billing cards fit in view. !11602 +- Extracted EE specific lines for spec/javascripts/vue_mr_widget/mock_data.js. !11847 + + +## 11.10.8 (2019-06-27) + +- No changes. +### Security (2 changes) + +- Gate MR head_pipeline behind read_pipeline ability. +- Do not allow localhost urls in GitHub Integration. + + +## 11.10.7 (2019-06-26) + +### Fixed (1 change) + +- Use quarantine size to check push size against repository size limit. !14271 + + +## 11.10.6 (2019-06-04) + +### Fixed (5 changes, 1 of them is from the community) + +- Fix removing and updating insights config, and foreign key constraints. !11030 +- Fix the group's epic page. The Paste issue link placeholder shown as 'undefinedundefinedundefined' in Chinese environment. And the error message showed nothing. !11312 (wdmcheng) +- Fix approvals project settings section when merge requests disabled. !12070 +- Use path instead of a URL for accessing approval settings. !12414 +- Fix relative url root issues with license management. !12488 + + +## 11.10.4 (2019-05-01) + +### Fixed (1 change, 1 of them is from the community) + +- Fix error retrieving licenses when relative URL in use. !11717 (Hiroyuki Sato) + +### Changed (1 change) + +- [Insights] Change the default weeks period limit to 12. !11498 + + +## 11.10.3 (2019-04-30) + +- No changes. + +## 11.10.2 (2019-04-25) + +### Security (1 change) + +- Handle race condition when creating an MR approval. + + +## 11.10.1 (2019-04-23) + +### Fixed (4 changes) + +- Fix approval rules when used with relative url root. !10819 +- Fix add/remove pipeline dashboard issue. !11029 +- Fix JWT token check when repository does not exist. !11033 +- Fix preventing approval of merge requests by an author. !11263 + +### Changed (2 changes) + +- Improve SAML settings with validation, design, and help text. !10450 +- Use a single color for the Insights time series bar charts. !11076 + + +## 11.10.0 (2019-04-22) + +### Security (3 changes) + +- Check label_ids parent when updating issue board. +- Geo - Improve security while redirecting user back to the secondary after a logout & re-login via the primary. +- Expose only basic group attributes in boards API. + +### Fixed (25 changes) + +- User Statistics in Admin Dashboard now a button. !8807 +- Fix misalignment of dropdowns in edit board modal of issue boards. !9909 +- Geo: Support archive recovery or streaming replication types in health check. !9935 +- Geo: Only display Geo-specific clone instructions button on a Geo Secondary node. !10007 +- Resolve Deletion of vulnerability-associated issuables prevents security report from loading. !10016 +- Elasticsearch API: Fix project_id showing as 0 for all blobs. A reindex will be required. !10020 +- Make editing the filters in the Group Security Dashboard easier. !10138 +- Geo - Reset the verification checksum after deployment refs are created. !10160 +- Search snippets via elasticsearch. !10325 +- Fixed bug preventing users from adding child epics with multiple children. !10331 +- Fix merge requests being added to Jira Development Panel. !10342 +- Fix authors of merge commits being excluded from approving an MR. !10359 +- Fix ChatOps Slack responder for gitlab.com. !10416 +- Fix sorting by priority with filtering by approvers. !10446 +- Make UpdateRepositoryStorageService idempotent. !10457 +- Fix broken links to protected environments on the CI/CD settings page. !10470 +- Notify owner that group is invalid when LDAP "Sync now" fails. !10509 +- Fix user agent string for Hosted Jira. !10545 +- Fix query used to calculate number of users over license. !10556 +- Fix pipeline bridge serialization error. !10565 +- Correct path to cluster health partial. !10638 +- Ensure Insights charts show all periods even if there are no data. !10733 +- Hide scoped labels help text without corresponding license. !10737 +- Fix merge request operation failure (e.g. assigning user) when project approvers required increases. !10766 +- Include subgroups when finding Insights issuables. !10801 + +### Changed (27 changes) + +- Move project search bar into modal dialog on Operations Dashboard page. !9260 +- Geo - Add selective sync support for the FDW queries to count synced registries. !9445 +- Geo - Add selective sync support for the FDW queries to count failed registries. !9527 +- Convert enable group authentication checkbox to toggle button. !9816 +- Geo: Limit max backoff time by 1 hour, instead of 7 days. !9893 +- Documented Guide to using Geo in HA with RDS cross-region replicas. !9985 +- Dynamically resize security group dashboard vuln graph. !10028 +- Add self approval of merge requests setting to merge requests approvals API. !10050 +- elasticsearch: Switch from LZ4 to DEFLATE compression. !10072 +- Geo - Store the invalid checksum when we have a mismatch. !10101 +- Add requested resources to cluster health metrics. !10135 +- Allow self-approvals in fallback approval rules. !10218 +- Geo - Add selective sync support for FDW queries to find verified registries. !10255 +- Add file line number to vuln modal. !10265 +- Geo - Add selective sync support for FDW queries to find registries where verification has failed. !10266 +- Enforce Geo JWT tokens scope for repository sync. !10303 +- Display link to review note in text email, similar to HTML email. !10401 +- Geo - Add selective sync support for the FDW queries to find mismatch registries. !10434 +- Geo - Add selective sync support for queries to find registries retrying verification. !10436 +- Geo - Add selective sync support for the FDW queries to find registries to verify. !10438 +- Improve DAST location fingerprints. !10487 +- Change order in dast location fingerprint. !10487 +- Geo: Add selective sync support for the FDW queries to find unsynced projects. !10522 +- Enrich container scanning with more data on the frontend. !10526 +- [Geo] Don't mark sync as successful if repo does not exist because of some problems. !10578 +- Move operations dashboard from Ultimate to Premium. !10586 +- Support multiple chart per page for Insights. + +### Performance (3 changes) + +- Avoid a Gitaly N+1 when loading commits for Elasticsearch search results. !9760 +- Geo: Optimize repository and wiki verification counts. !9939 +- Avoid N+1 when loading Code search results with Elasticsearch enabled. !10394 + +### Added (31 changes, 1 of them is from the community) + +- Add approval and unapproval webhooks. !8742 +- Adding pipelines to the operations dashboard. !9197 +- Add operations dashboard usage counts to usage data. !9291 +- Automatically deprovision and update users from a configured identity via SCIM. !9388 +- Add SCIM Token section to SAML SSO Settings. !9619 +- Use merge request MERGE ref for attached merge request pipelines. !9622 +- Geo: Support syncing over non-publicly accessible URLs. !9634 +- Prevent merge if the merge request pipeline is stale. !9643 +- Block possibility to change email for users with group managed account. !9712 +- Geo admin panel for upload verification. !9720 +- Geo: Create separate models for different registries. !9755 +- Add ability to purchase extra CI minutes. !9815 +- Update Web IDE config to accept ports. !9818 +- Allow per-project and per-group enabling of Elasticsearch indexing. !9861 +- Geo: Help admins diagnose configuration problems. !9988 +- Added MAVEN_CLI_OPTS env var support to License Management CI job. !10012 +- Show DAST vulnerabilities in the Group Security Dashboard. !10271 +- Show DAST in Group Security Dashboard Back-End. !10277 +- Removing pipeline dashboard feature flag. !10302 +- Update user name upon LDAP sync. !10316 (@icode1) +- Collect usage of pod logs feature. !10370 +- Added metrics reports widget to merge request page. !10380 +- IP whitelisting for Geo-enabling functionality in the primary. !10383 +- Persist in the URL the page and day range of vulnerabilities viewed in the Group Security Dashboard. !10402 +- Add 'Metrics' job artifact report type. !10452 +- Create a user via SCIM. !10456 +- Geo: Display secondary replication lag on console (if lag > 0 seconds). !10471 +- Add Roadmap to Epic page. !10488 +- Expose merge request pipeline parameters for MR widget. !10502 +- Allow instance admins to link all projects to Jira DVCS. !10541 +- Added mutually exclusive key value labels. + +### Other (4 changes) + +- Simplify admin instance licenses page. !9785 +- Extract EE specific files and externalize strings in admin application settings. !9930 +- Add specs for coerced labels parameter in Epics API. !9932 +- Improve project service desk settings. !10381 + + +## 11.9.12 (2019-05-30) + +### Security (3 changes, 1 of them is from the community) + +- Filter relative links in wiki for XSS. (kerrizor) +- Fix XSS in Ancestor tooltip title. +- Ignore out of range epic IDs. + + +## 11.9.10 (2019-04-26) + +### Security (1 change) + +- Handle race condition when creating an MR approval. + +### Fixed (1 change, 1 of them is from the community) + +- Fix the group's epic page. The Paste issue link placeholder shown as 'undefinedundefinedundefined' in Chinese environment. And the error message showed nothing. !11312 (wdmcheng) + + +## 11.9.9 (2019-04-23) + +### Fixed (1 change) + +- Fix approval rules when used with relative url root. !10819 + + +## 11.9.8 (2019-04-11) + +### Fixed (1 change) + +- Fix sorting by priority with filtering by approvers. !10446 + + +## 11.9.7 (2019-04-09) + +### Security (1 change) + +- Expose only basic group attributes in boards API. + + +## 11.9.6 (2019-04-04) + +### Fixed (3 changes) + +- Fix project approval rule with only private group being considered as approved when override is allowed. !10356 +- Fix approval rule sourcing from forked MR. !10474 +- Guard against ldap_sync_last_sync_at being nil. !10505 + +### Added (1 change) + +- Add Insights frontend to retrieve and render chart. !9856 + + +## 11.9.5 (2019-04-03) + +### Fixed (3 changes) + +- Fix project approval rule with only private group being considered as approved when override is allowed. !10356 +- Fix approval rule sourcing from forked MR. !10474 +- Guard against ldap_sync_last_sync_at being nil. !10505 + +### Added (1 change) + +- Add Insights frontend to retrieve and render chart. !9856 + + +## 11.9.3 (2019-03-27) + +### Security (1 change) + +- Check label_ids parent when updating issue board. + + +## 11.9.2 (2019-03-26) + +### Security (2 changes) + +- Geo - Improve security while redirecting user back to the secondary after a logout & re-login via the primary. +- Check label_ids parent when updating issue board. + + +## 11.9.1 (2019-03-25) + +### Fixed (1 change) + +- Fix date save for Epic to reflect on UI immediately after save. !10321 + + +## 11.9.0 (2019-03-22) + +### Security (4 changes) + +- Prevent Group SAML authorizing sign in without prior user approval. +- Respect group membership lock when importing a member from another group. +- Remove the possibility to share a project with a group that a user is not a member of. +- Prevent SAML access when disabled by group admin on GitLab.com. + +### Fixed (22 changes) + +- Allow assigning Prometheus alerts to multiple environments. !7361 +- Fix repo pushes while initial Elasticsearch indexing not permitting initial indexing to complete. !9478 +- Fix vulnerability occurrence scope to trailing 30 days. !9494 +- Skip whitelisted vulnerabilities in Container Scanning reports. !9528 +- Fix npm registry for yarn. !9599 +- Renders inline downstream & upstream pipelines. !9627 +- Prunes whole Geo event when there's only a primary. !9630 +- Fix alert notifications for non-public projects. !9636 +- Fix 500 error when visiting merged merge request. !9648 +- Allow plus symbol in maven package version. !9657 +- Show commands applied message when promoting issues to epics. !9669 +- Ensure comments from merge request review is displayed in the same order as user commenting order. !9684 +- Geo - Fix selective sync by namespace. !9732 +- Fix bridge jobs than can be hidden keys too. !9796 +- Fix approval-related UI showing up in free plan. !9819 +- Add 'No approvals required' view to approval rules (behind feature flag). !9899 +- Fix npm package install with a dot in the name. !9900 +- GroupSAML for GitLab.com prevents blank NameID. !9907 +- Fix protected environment initializer. !10150 +- Fix SSH pull mirrors not working. !10272 +- Fix HTML spew in Locked Files page. +- Fixes Broken new/edit feature flag form. + +### Changed (9 changes, 1 of them is from the community) + +- Remove authorization from /managed_licenses. !8541 +- Consider dismissed items in security reports summary. !9275 +- Add backend for cross-project pipeline dashboard MVC. !9396 +- Create merge request approval rule for each code owner entry. !9455 +- Split severity and confidence values for vulnerabilities. !9495 +- Enforce Geo JWT tokens scope for file uploads and Geo API. !9502 +- Update cluster health empty state. !9540 (George Tsiolis) +- Add extra graph spacing on the Security Dashboard Group Vulnerability Chart. !9780 +- Add Kerberos URL back to clone panel. !9840 + +### Performance (1 change) + +- Eliminate N+1 queries in Epics API. !9897 + +### Added (23 changes, 1 of them is from the community) + +- Enabled setting the Security Dashboard as a default view for groups. !7889 +- Add reordering of child epics. !9283 +- Create MR from Vulnerability Solution. !9326 +- Create pool repositories on Geo secondaries. !9428 +- Add date range for security dashboard graph. !9446 +- Add filtering merge requests by approvers. !9468 +- Add audit log for managing feature flags. !9487 +- Add DELETE package API endpoint. !9623 +- Enrich container scanning report. !9641 +- Adapt feedback for Container Scanning vulnerabilities. !9655 +- Enforce merge request approvals from code owners. !9656 +- Added vendored CI/CD template for Dependency Scanning job. !9660 +- Add Insights config behind the "group_insights" feature flag. !9665 +- Add single package API endpoint. !9667 +- Added GET /licenses and DELETE /license/:id endpoints. !9733 +- Add container scanning results to group security dashboard. !9736 +- Add an incident management settings form and create issues from alertmanager alerts. !9773 +- Add API for reordering child epics. !9781 +- Allow guests to comment on epics. !9783 +- Display Recent Boards in Board switcher. !9808 +- Add Ancestors in Epic Sidebar. !9817 +- Add vendored templates for SAST, DAST, Container Scanning and License Management job definitions. !9921 +- Add realtime validation for user fullname and username on validation. !25017 (Ehsan Abdulqader @EhsanZ) + +### Other (12 changes, 1 of them is from the community) + +- Use export-import svg from gitlab-svgs. !9453 +- Renames 'revert dismissal' to 'undo dismiss' on the Group security dashboard. !9500 +- Using positional arguments in request specs have been deprecated. !9506 (Jasper Maes) +- Splits the severity and confidence constants in the group security dashboard frontend. !9535 +- Add Gitlab.com gold trial callout to /billings. !9611 +- Update project settings section titles and info. !9614 +- Improve visual consistency of values in vulnerability modal. !9616 +- Limit Group Security Dashboard to selected types of report. !9626 +- Make related issues components reusable. !9730 +- sidekiq-cluster: put each sidekiq in a new pgroup. !9775 +- License Management: Load up to a 100 licenses per default. !9913 +- Adds documentation for autoremediation. !10054 + + +## 11.8.10 (2019-04-30) + +- No changes. + +## 11.8.3 (2019-03-19) + +- No changes. + +## 11.8.2 (2019-03-13) + +### Fixed (4 changes) + +- Fix 500 error when visiting merged merge request. !9648 +- Fix bridge jobs than can be hidden keys too. !9796 +- Fix approval-related UI showing up in free plan. !9819 +- Add 'No approvals required' view to approval rules (behind feature flag). !9899 + + +## 11.8.0 (2019-02-22) + +### Security (2 changes) + +- Sanitize user full name to clean up any URL to prevent mail clients from auto-linking URLs. !790 +- Hide personal access tokens from other maintainers. + +### Fixed (28 changes, 1 of them is from the community) + +- Add keyboard navigation to issue board switcher and remove duplicate scroll bar. !8591 +- Geo: Always update the default branch on the secondary. !9064 +- Fix public group milestones not shown in epics autocomplete. !9068 +- Check hosts file for nameserver IP. !9071 +- Fixes the icon for fixed vulnerability in Container Scanning report. !9120 +- Return 400 error instead of 500 when upload maven package with invalid version. !9125 +- Fix mirrors that have invalid SSH public auth mode set. !9135 +- Hide packages without version from UI. !9151 +- Remove duplicate "Operations Dashboard" header/breadcrumb. !9152 (Nathan Friend) +- Create UTC date in subscription table. !9166 +- Display epic icon in related epics list. !9166 +- Don't validate Jenkins username if password is blank. !9198 +- Don't show Alert widget for non-licensed users. !9224 +- Group security dashboard: Fix overflow for Vulnerabilities with long titles. !9271 +- Geo - Respect shard restriction while loading new resources to verify on the Geo secondary node. !9343 +- When cleaning up repositories, ensure orphaned entries do not remain in the tracking database. !9344 +- Geo - Make sure project does not meet selective sync rule before deleting it. !9345 +- Fix alert notification emails are not being sent. !9393 +- Fix alert notifications for managed Prometheus. !9402 +- Replacing old blob methods in ElasticSerach module. !9418 +- Add checks to prevent cycling hierarchy in epics structure. !9438 +- Fix bug where users could not be added in protected branch rules. !9474 +- Avoid SAML required_groups indiscriminately unblocking users on login. !9489 +- Resolve Cannot scroll forwards in time for roadmap view. !9530 +- Fix unleash server side cannot return feature flags. !9532 +- Show alerts settings only for manual configuration. !9538 +- Fix access to constant Gitlab::RepositorySizeError. !9579 +- Clear our import data credentials when adding new mirrors. !24339 + +### Deprecated (1 change) + +- Geo: Show hashed storage warnings on geo nodes page. !8433 + +### Changed (14 changes) + +- Prevent commit authors from self approvaling merge requests. !9007 +- Add docs link to explain legacy and new email format. !9020 +- Recursively expands upstream and downstream pipelines. !9073 +- Geo: Don't show external link icon on current node. !9130 +- Issues created from vulnerabilities are now confidential by default. !9157 +- Validate custom metrics. !9178 +- Change paginate number to 20. !9213 +- Convert buttons to button group on Group Security Dashboard. !9220 +- Make it possible to edit Geo primary through API. !9328 +- Geo: Handle repository and wiki sync separately in Geo::ProjectSyncWorker. !9360 +- Geo: Add settings page empty state. !9415 +- Renders New and Edit forms for feature flag in Vue and allow to define scopes. +- Improves title in feature flags empty states. +- Adds environment column to the feature flags page. + +### Performance (5 changes) + +- Solve a N+1 issue in Groups::AnalyticsController. !4508 +- Refactored Epic app in Vuex for better performance and maintenance. !9361 +- Optimize slow pipelines.js response. !9387 +- Disable commit checks when no push rules are active. !9569 +- Enable some frozen string in ee/lib. + +### Added (22 changes, 1 of them is from the community) + +- Elasticsearch: Support for Gitaly. !7434 +- Canary deployment callout on the environments page. !8457 +- Allow to filter notes in epics. !8978 +- Multiple blocking merge request approval rules (behind feature flag). !9001 +- Add support for auto-expanding Roadmap timeline on horizontal scroll. !9018 +- Added Snowplow tracking to issues import. !9067 +- Persist Group Level Security Dashboard state in URL. !9108 +- Multiple environments support for feature flags (Unleash API standpoint). !9110 +- Shows the approval given/required counts and its status for each MR when viewing the Merge Requests page. !9142 (Glavin Wiechert, Andy Steele) +- Support CURD operation for feature flag scopes. !9182 +- Add epic links API endpoints. !9188 +- Store DAST scan results in the database. !9192 +- Add LDAP integration to smartcard authentication. !9235 +- Allow SSO enforcement in group settings for GitLab.com. !9240 +- Add API endpoint for project packages. !9259 +- Add upvote/downvote information to epics API. !9264 +- Resolve Implement access controls when SSO enforcement enabled. !9270 +- Add package files API endpoint. !9305 +- Support alerts from external Prometheus servers. !9334 +- Cross-project pipelines support in .gitlab-ci.yml. !9374 +- Enable mails for external alerts. !9457 +- Moving repository across shards leaves the pool. + +### Other (13 changes, 7 of them are from the community) + +- Gather JIRA DVCS integration usage data. !8949 +- ActiveRecord::Migration -> ActiveRecord::Migration[5.0] for AddAlertManagerTokenToClustersApplicationPrometheus and EnqueuePrometheusUpdates. !9049 (Jasper Maes) +- Track navbar links in Snowplow. !9059 +- Adds snowplough tracking for the group security dashboard filters. !9119 +- Support Ajax endpoints for FeatureFlagsController. !9127 +- Fix deprecation: Passing an argument to force an association to reload is now deprecated. !9140 (Jasper Maes) +- Fix deprecation: #original_exception is deprecated. Use #cause instead. !9141 (Jasper Maes) +- Uses GLDropdown for licence management. !9237 +- Replace deprecated render text. !9346 (Jasper Maes) +- Fix several ActionController::Parameters deprecations. !9347 (Jasper Maes) +- Fix deprecation: uniq is deprecated and will be removed from Rails 5.1. !9348 (Jasper Maes) +- Turn on rubocop for frozen string in ee/. (gfyoung) +- Creates an EE component for the pipeline graph. + + +## 11.7.12 (2019-04-23) + +- No changes. + +## 11.7.11 (2019-04-09) + +### Security (1 change) + +- Expose only basic group attributes in boards API. + + +## 11.7.10 (2019-03-28) + +### Security (1 change) + +- Check label_ids parent when updating issue board. + + +## 11.7.8 (2019-03-26) + +### Security (2 changes) + +- Geo - Improve security while redirecting user back to the secondary after a logout & re-login via the primary. +- Check label_ids parent when updating issue board. + + +## 11.7.7 (2019-03-19) + +- No changes. + +## 11.7.5 (2019-02-05) + +### Fixed (2 changes) + +- Fix Kerberos authentication. !9390 +- Fix background migration error when project repository is missing. !9392 + + +## 11.7.2 (2019-01-29) + +### Security (6 changes) + +- Avoid leaking unauthorized approver group members. !766 +- Sanitize user full name to clean up any URL to prevent mail clients from auto-linking URLs. !791 +- Check access rights when creating/updating ProtectedRefs. +- Fix locked file visibility issue for private repositories. +- Filter out non-project member approvers. +- Remove HTTP POST in JIRA OAuth access_token endpoint. + + +## 11.7.1 (2019-01-28) + +### Security (6 changes) + +- Avoid leaking unauthorized approver group members. !766 +- Sanitize user full name to clean up any URL to prevent mail clients from auto-linking URLs. !791 +- Check access rights when creating/updating ProtectedRefs. +- Fix locked file visibility issue for private repositories. +- Filter out non-project member approvers. +- Remove HTTP POST in JIRA OAuth access_token endpoint. + + +## 11.7.0 (2019-01-22) + +### Security (1 change) + +- Add a shared secret to prevent abuse of the alert endpoint. + +### Fixed (27 changes, 2 of them are from the community) + +- Defaults to feature flags link for Operations entry. !8622 +- Fix error on explore page when logged out due to gold trial callout. !8674 +- Prevents the empty state from showing when the dashboard errors. !8703 +- Allow matching only the repo-root for CODEOWNERS. !8708 +- Fix adding labels to epics using quick actions. !8772 +- Geo: Keep the minimum cursor last event. !8832 +- Reinstate sorting issuable by weight. !8834 +- Geo - Show the proper label for the last repository check run on Geo projects page. !8844 +- Resolve Reorder gitlab:elastic:index rake tasks to ensure wikis and database are completed even if projects error out. !8852 +- Remove dash on issue weight for unauthorized users. !8882 (George Tsiolis) +- Dismiss epic promotion and persist it across reloads. !8885 +- Fix JIRA Development Panel links with subgroups. !8908 +- Remove epic field in sidebar for projects without groups. !8919 +- Remove duplicate padding from issue board switcher. !8928 +- Resolve Ctrl+Enter immediately adds MR comment. !8932 +- Geo: Ignore invalid attributes when updating Geo node status. !8957 +- Fix border-radius for related issues. !8958 (Johann Hubert Sonntagbauer) +- Fix Security Dashboard Header font size. !9011 +- Fix title and description for issue created from a vulnerability. !9022 +- Pseudonymizer: Gracefully handle empty pseudo entries. !9044 +- Fix permission check when creating an issue from a vulnerability. !9055 +- Docfix - broken doc links for Secure/Autodevops features. !9058 +- Fix Error 500 when deleting a pipeline via the API. !9104 +- Uses project_id instead of project on the group security dashboard. !9109 +- Recursively get all of a groups projects. !9205 +- Fix data migration failure if approvals_before_merge is set to too high. !9217 +- Don't remove milestones when moving issues to board backlog from non-milestone list. + +### Changed (5 changes, 1 of them is from the community) + +- Update Geo nodes empty state. !8576 (George Tsiolis) +- Add search field to issue board switcher. !8862 +- Allow downloading package files from UI. !8888 +- Changes to the data model for counts on the Group Security Dashboard. !9035 +- Fix packages UI mentioned only Maven packages support. !9132 + +### Performance (2 changes, 1 of them is from the community) + +- Fix timeout loading Open list when board contains assignee lists. +- Enable some frozen string in ee/lib. (gfyoung) + +### Added (17 changes) + +- Add an instance-level endpoint for downloading maven packages. !8274 +- Add NPM registry support to GitLab packages. !8673 +- Store container scanning CI jobs results into the database. !8797 +- Add a group-level endpoint for downloading maven packages. !8798 +- Add Filtering vulnerabilities in the Group Security Dashboard. !8817 +- Allow to filter Feature Flags. !8821 +- Geo - Show last verification time on Geo projects page. !8845 +- Adds basic filtering to the Group Security Dashboard frontend. !8886 +- Autocomplete issues and MRs in epics. !8936 +- Adds project filtering to the GSD. !8944 +- Allow using TCP for DB load balancing DNS lookups. !8961 +- Add filtering for summary and history on security dashboard. !8972 +- Add solution card to the vulnerability modal. !9030 +- Allows the Group Security Dashboard to select multiple filters. !9031 +- Added Snowplow tracking to issues export. !9045 +- Add support for relationship between epics. !9051 +- Added pagination to epics API endpoint. + +### Other (13 changes, 3 of them are from the community) + +- Promote starting a GitLab.com Gold trial on the dashboard. !6947 +- Adds event tracking to navbar. !7787 +- Update tracing settings to match error tracking settings. !8786 +- Adapt subscriptions page for free plans and trials. !8838 +- Support for new SAST and dependency scanning report format. !8869 +- Remove deprecated ActionDispatch::ParamsParser. !8897 (Jasper Maes) +- Fix deprecation: Comparing equality between ActionController::Parameters and a Hash is deprecated. !8914 (Jasper Maes) +- Removes Notes from GitLab Pseudonymizer config. !8923 +- Add count of projects with tracing enabled to usage ping data. !8940 +- Adds dependency scanning to the report type filters on GSD. !9034 +- Fix deprecation: Using positional arguments in specs for EE spes in spec/. !9040 (Jasper Maes) +- Pass issuable-type in AddIssuableForm. !9111 +- Gather deepest epic relationship data. + + +## 11.6.11 (2019-04-23) + +- No changes. + +## 11.6.10 (2019-02-28) + +### Security (5 changes) + +- Remove the possibility to share a project with a group that a user is not a member of. +- Prevent Group SAML authorizing sign in without prior user approval. +- Prevent SAML access when disabled by group admin on GitLab.com. +- Respect group membership lock when importing a member from another group. +- Ignore out of range epic IDs. + + +## 11.6.9 (2019-02-04) + +- No changes. + +## 11.6.8 (2019-01-30) + +- No changes. + +## 11.6.5 (2019-01-17) + +### Fixed (1 change) + +- Fix Error 500 when deleting a pipeline via the API. !9104 + + +## 11.6.4 (2019-01-15) + +- No changes. + +## 11.6.3 (2019-01-04) + +### Fixed (1 change) + +- Fix instance project templates no longer working. !9019 + + +## 11.6.2 (2019-01-02) + +### Fixed (1 change) + +- Fix issue ID wrapping and avatar counter shrinking in Related Issues list. !8854 + + +## 11.6.1 (2018-12-28) + +### Security (1 change) + +- Add a shared secret to prevent abuse of the alert endpoint. + + +## 11.6.0 (2018-12-22) + +### Security (7 changes) + +- Switch from CBC to GCM for Geo logout tokens. !8518 +- Prevent reporter roles from viewing the Jaeger tracing settings page. +- Sanitize tracing external_urls before saving to DB and when displaying the URL to prevent XSS issues. +- Fix IDOR at /drafts/publish. +- Authorize users when listing board users and milestones. +- Resolve: Guest can set weight of a new issue. +- Fixes XSS with merge request approvers selection. + +### Fixed (27 changes, 2 of them are from the community) + +- Ensure that avatars in approvals have correct tooltip. !6269 +- Geo: Fix push to secondary over SSH for LFS. !8044 +- Don't show packages tab and settings for starter license. !8270 +- Makes the vulnerability name on the Group Security Dashboard a button for better A11y. !8341 +- Used the iid instead of the id for linked issues on the Group Security Dashboard. !8357 +- Show navigation line separator when instance etrics is disabled. !8379 (George Tsiolis) +- Fix project deploy key creation and deletion as admin. !8432 +- Changes initial state for disabled prometheus integrations. !8434 +- Fix a typo in Admin: intergration -> integration. !8444 (Vincent AUBERT) +- Geo: Moving registry deletion into the job that deletes the files and project record. !8480 +- Parameterize alerting rules with variables. !8481 +- Fix PostReceive failing for project mirrors missing local branch. !8495 +- Rails 5: Fix the check whether the database is in read-only mode. !8594 +- Raisl 5: Fix Gitlab::Database::LoadBalancing#caught_up? check. !8595 +- Renders upstream and downstream pipelines in the main pipeline graph. !8607 +- Fix issue board api with special milestones. !8653 +- fix pod dropdown not switching pod logs. !8660 +- Geo - Respect the next retry time when re-verifying failed repositories. !8661 +- Update elasticsearch system check to check for new supported versions. !8683 +- Handle null start or due dates for dates sourcing milestone in Epics. !8689 +- Fixed license managment path in MR widget for fork cases. !8700 +- Fix gitlab:geo:check rake task. !8714 +- Fix ability to choose shards for selective sync. !8717 +- Add Rails.version to the Geo cache keys. !8775 +- Support older NGINX version forwarding the client certificate for smartcard auth. !8784 +- Remove duplicated smartcard login button. !8793 +- Disable password autocomplete in mirror form fill. + +### Deprecated (1 change) + +- Deprecate non-hashed repository storage for Geo installations. !8739 + +### Changed (17 changes, 1 of them is from the community) + +- Adds Group SAML metadata endpoint. !5782 +- Group SAML SSO page warns when linking account. !8295 +- Change the delete custom metric alert. !8430 +- Replace weight icon. !8448 (George Tsiolis) +- Switch snowplows stateStorageStrategy to cookie. !8461 +- Move merge request approval settings. !8493 +- Geo: Constantly reverify repositories. !8550 +- Add file and line numbers to issues created from SAST vulnerabilities. !8578 +- Redesign MR header sections and approvals (EE). !8593 +- Add packages_enabled attribute to Projects API. !8604 +- Run geo check task from gitlab check. !8616 +- Change issue create weight dropdown to an input. !8648 +- Add epics state filtering in roadmap view. !8658 +- Users can unlink Group SAML from accounts page. !8682 +- Update casing in Built-in on project templates tab. !8688 +- Epic issue list and related issue list re-design. +- Add sort direction button with sort dropdown for Epics and Roadmap. + +### Performance (5 changes, 3 of them are from the community) + +- Remove partial index for projects on mirror and mirror_last_update_at. !8585 +- Enable some frozen string in ee/app. !8667 (gfyoung) +- Remove redundant indices for is_sample on push_rules and next_execution_timestamp on project_mirror_data. !8695 +- Enable some frozen string in ee/app. (gfyoung) +- Enable some frozen string in ee/app. (gfyoung) + +### Added (10 changes) + +- Add support for Group-level project templates. !6878 +- Added web terminals to Web IDE. !7386 +- Promote an Issue to an Epic using quick action. !8051 +- Smartcard authentication. !8120 +- Adds Security dashboard empty state. !8443 +- Add vulnerability history at group level. !8603 +- Adds group security dashboard metrics chart. !8631 +- Add milestones autocomplete for epics. !8632 +- Parse and store dependency scanning reports in database. !8642 +- Adds EE store to handle upstream & downstream pipelines. + +### Other (13 changes, 4 of them are from the community) + +- Add subscription table to GitLab.com billing areas. !7885 +- UX improvements for the group security dashboard. !8217 +- Restyles the dismissed vulnerabilities. !8401 +- Adds PHILOSOPHY.md and references GitLab Product Handbook. !8515 +- Make sidekiq-cluster play well with Sidekiq 5.2.2+. !8522 +- Rails5: Passing a class as a value in an Active Record query is deprecated. !8540 (Jasper Maes) +- render :nothing option is deprecated, Use head method to respond with empty response body. !8560 (Jasper Maes) +- Add help page link for licence management in CI/CD settings. !8561 (George Tsiolis) +- Re-orders the Group Security Dashboard. !8624 +- Move EE only differences for finders. !8629 (George Tsiolis) +- Add count of projects with at least one package to a usage ping data. !8641 +- Added recommendations for handling deleted documents in Elasticsearch. +- Use new information-o icon for Security Dashboard. + + +## 11.5.11 (2019-04-23) + +### Security (1 change) + +- Respect group membership lock when importing a member from another group. + + +## 11.5.8 (2019-01-28) + +### Security (6 changes) + +- Avoid leaking unauthorized approver group members. !766 +- Sanitize user full name to clean up any URL to prevent mail clients from auto-linking URLs. !793 +- Check access rights when creating/updating ProtectedRefs. +- Fix locked file visibility issue for private repositories. +- Filter out non-project member approvers. +- Remove HTTP POST in JIRA OAuth access_token endpoint. + + +## 11.5.5 (2018-12-20) + +- No changes. + +## 11.5.3 (2018-12-06) + +- No changes. + +## 11.5.2 (2018-12-03) + +### Fixed (2 changes) + +- Fix inability to scroll dashboard. !8459 +- Fix issues analytics query when ordering issues by priority. !8509 + + +## 11.5.1 (2018-11-26) + +### Security (6 changes) + +- Sanitize tracing external_urls before saving to DB and when displaying the URL to prevent XSS issues. +- Prevent reporter roles from viewing the Jaeger tracing settings page. +- Fix IDOR at /drafts/publish. +- Authorize users when listing board users and milestones. +- Resolve: Guest can set weight of a new issue. +- Fixes XSS with merge request approvers selection. + + +## 11.5.0 (2018-11-22) + +### Security (2 changes) + +- Escape entity title while autocomplete template rendering to prevent XSS. !696 +- Prevent templated services from being imported. + +### Removed (1 change) + +- Remove security report summary from pipelines view. !7844 + +### Fixed (25 changes, 3 of them are from the community) + +- Geo: Remove connectivity check from primary to secondary from gitlab:geo:check rake task. !7821 +- Include (closed) for closed epics in parsed text. !7946 +- Add new state to the cluster application vue app. !7954 +- Do not allow to assign an issue to an epic twice. !8004 +- [Geo] Fix: Deleting a project leaves orphaned LFS objects and CI Job artifacts around. !8031 +- Support `/client/features` Unleash endpoint. !8045 +- Fix button rendering in license management in FF. !8046 +- Geo: Handle orphaned Uploads records. !8054 +- Geo - Redirect user back to the secondary after a logout & re-login via the primary. !8157 +- Fix approver removal still being conducted even when "Cancel" is clicked in confirmation prompt. !8178 +- Link project short SHA to commit url. !8214 +- Update ops dashboard remove dropdown button. !8236 (George Tsiolis) +- Clear ops dashboard project search input on submit. !8239 (George Tsiolis) +- Fixes a dismissed vulnerability bug on the group security dashboard. !8343 +- Fixes missing fields on the group security dashboard. !8360 +- Fixes the view issue button in the Group Security Dashboard. !8385 +- Ops Dashboard should be available for public projects on GitLab.com. !8399 +- Update draft comments design to match new design. !8405 +- Change issues analytics breadcrumb. !8414 (George Tsiolis) +- Include classification label in project API. !8426 +- Fix Pod Log topbar position when perf bar is disabled. +- Always proxy reports downloads. +- Removes extra rigth margin from job page. +- Geo: Rails console message display primary/secondary state incorrectly. +- Disable Feature Flags and Packages if repository is disabled. + +### Changed (13 changes, 1 of them is from the community) + +- Add test button to Group SAML settings. !5622 +- Group SAML status badges on members page. !5807 +- Update related issues list styling to be more space efficient. !7784 +- Refactor test reports to use new artifact architecture. !7827 +- Add timeline icon for issue weights. !7847 (George Tsiolis) +- Added a search bar to `Admin > Geo > Projects`. !8079 +- Geo: Deprecate source installations instructions. !8134 +- Does not synchronize default branch for pull mirrors. !8138 +- Adds split error states for the group security dashboard. !8208 +- Geo: Improve read-only message in secondary nodes for actionable screens. !8238 +- Improve error messages for operations dashboard. !8244 +- Add documentation link to ops dashboard. !8296 +- Issue board card design. !21229 + +### Added (24 changes, 1 of them is from the community) + +- Group-level file templates. !7391 +- Adds group-level Security Dashboard counts. !7564 +- Parse SAST reports and store vulnerabilities in database. !7578 +- elasticsearch 6 support - migrate from parent/child relationships to join. !7618 +- Geo: Admin > Geo > Projects support for batch operations. !7806 +- Create system notes for epic close and reopen. !7850 +- Add Tracing landing and settings page. !7903 +- Add modals and actions to the vulnerabilities in the Group security dashboard. !7910 +- Assign code owner as approver. !7933 +- Enable previewing of draft review comments. !7936 +- Audit log: Add logging for project feature changes. !7962 +- Add project operations dashboard. !7973 +- Audit log: Add audit events for group setting changes. !7987 +- Add approve quick action. !7989 +- Show actual Milestone dates within tooltips for Milestones in Epics sidebar. !8048 +- Allow filtering by weight in issues API. !8140 (Heinrich Lee Yu) +- Filter epics by state in API. !8179 +- Support epics autocomplete for project objects. !8180 +- Add 'l', 'r' and 'e' keyboard shortcuts support in Epic. !8203 +- Configurable GitHub static context for statuses integration. !8235 +- Send notifications for epic status change. !8247 +- Support license management and performance using new reports syntax. +- Support reports: for project security dashboard. +- Add chart of issues created per month. + +### Other (17 changes, 11 of them are from the community) + +- Update boards list selector specs. !6266 (George Tsiolis) +- Write some Geo development documentation. !7452 +- Connects the Group Security Dashboard API and Frontend. !7793 +- Rails5: Fix epics finder count_key method In Rails5, the state enum value is passed instead of the database integer. !7822 (Jasper Maes) +- Rails 5: fix presence message validation for prometheus_alert. !7823 (Jasper Maes) +- Rails 5: fix mysql milliseconds problem in prometheus alert event spec. !7828 (Jasper Maes) +- Rails5: fix VulnerabilitySummaryEntity. !7893 (Jasper Maes) +- Update feature flags empty state. !7967 (George Tsiolis) +- Adds the security dashboard link. !7974 +- Remove tooltip on sidebar text buttons. !8021 (George Tsiolis) +- Add a metric to the usage ping data to track the number of projects with at least one alert. !8058 +- Remove unneeded permission checks from the mirror repositories partial. !8077 +- Rails5: fix flaky mysql reset pipeline minutes spec. !8122 (Jasper Maes) +- Move `prepend` outside the `class` block for finders. !8192 (George Tsiolis) +- Rails5: fix operations controller spec nil parameter. !8209 (Jasper Maes) +- Update related issues title typography. !8267 (George Tsiolis) +- Geo: Clarify Geo HA documentation. + + +## 11.4.9 (2018-12-03) + +- No changes. + +## 11.4.8 (2018-11-27) + +### Security (5 changes) + +- Escape entity title while autocomplete template rendering to prevent XSS. !707 +- Authorize users when listing board users and milestones. +- Fix IDOR at /drafts/publish. +- Resolve: Guest can set weight of a new issue. +- Fixes XSS with merge request approvers selection. + + +## 11.4.7 (2018-11-20) + +### Fixed (1 change) + +- Fix code owner as merge request suggestion not available under Starter plan. !8248 + + +## 11.4.6 (2018-11-18) + +### Security (1 change) + +- Prevent templated services from being imported. + + +## 11.4.5 (2018-11-04) + +### Fixed (1 change) + +- Stops showing review actions on commit discussions in merge requests. !8007 + +### Performance (1 change) + +- Add indexes to all geo event foreign keys. !7990 + + +## 11.4.4 (2018-10-30) + +- No changes. + +## 11.4.3 (2018-10-26) + +- No changes. + +## 11.4.2 (2018-10-25) + +### Security (1 change) + +- Escape entity title while autocomplete template rendering to prevent XSS. !707 + + +## 11.4.1 (2018-10-23) + +- No changes. + +## 11.4.0 (2018-10-22) + +### Security (3 changes) + +- Properly filter private references from system notes. +- Project groups approvers no longer leak private groups info. +- Protect against CSRF attacks when adding Slack app. + +### Removed (1 change) + +- remove unnecessary help text from container scanning results. !7304 + +### Fixed (18 changes, 1 of them is from the community) + +- Prune all the Geo event log tables correctly. !6175 +- Synchronize the default branch when updating a pull mirror. !7242 +- Pushing to a merge request clears the approvals list even if the respective project setting is enabled and there is no fixed required number of approvals configured. !7328 +- Align epics and roadmap empty state buttons to the center. !7358 (George Tsiolis) +- Add link to issue on epic. !7407 +- Check for force env var when rebuilding auth_keys. !7419 +- Update popover URL to point to help page of same domain. !7446 +- Geo - Does not raise error 500 on Geo projects list page for orphaned entries. !7565 +- Show promotion for epics on issues. !7602 +- Fix Epic subscription toggle behaviour. !7723 +- Geo - Send a cache invalidation event via the log cursor whenever features are changed on the primary. !7738 +- Fix epic milestone dates incorrect after issue is linked to another epic. !7809 +- Fixes warning for used minutes in runner showing when user still has minutes. !7843 +- Fix disappearing weight input in Firefox. !7869 +- Don't synchronize default branch when updating a SSH mirror. !7891 +- Fix broken tokenization for filtered search bar in Epics. !7972 +- Fix bug when resolving a discussion via a batch comment published right away. +- Fix wrong color in resolve/unresolve checkbox when using MR reviews. + +### Changed (14 changes) + +- Geo: Decrease frequency of project shard schedulers when few projects to schedule. !7287 +- Added placeholder to weight input for issue sidebar. !7346 +- updated icons used in filtered search dropdowns. !7356 +- Geo: Display helpful feedback when proxying an SSH git push to secondary request. !7357 +- Geo - Include keep-around and other Gitlab-specific references in the checksum calculation. !7367 +- Polish security report externalizations. !7373 +- Listen for resolved Prometheus alerts. !7382 +- Rename date related labels for Epics. !7447 +- Add reports CI syntax for Code Quality reports. !7465 +- Support short reference to epics from project entities. !7475 +- Geo: Downgrade Exclusive Lease warnings from Log Cursor to debug. !7476 +- Geo: Allow nodes to be editable in more scenarios. !7832 +- Account for issues created in the middle of a milestone in burndown chart. +- [Geo] Add CI job artifact numbers to rake geo:status. + +### Performance (1 change) + +- Update DB model for security reports. + +### Added (20 changes, 1 of them is from the community) + +- Batch comments on merge requests. !4213 +- Use Geo log to remove files when migrated to object storage. !5966 +- Add support for closing epics. !7302 +- Add `auditor_groups` configuration so Audit users can be specified using SAML groups. !7340 (St. John Johnson) +- Geo - Add an event to reset checksums on Geo secondary nodes. !7394 +- Starts adding the dashboard page view. !7400 +- Add `Manage licenses` button to MR widget and pipelines view. !7411 +- Add Open/Closed epics tabs in list view. !7424 +- Add Feature Flags MVC. !7433 +- Suggest approvers based on code owners. !7437 +- Geo: Add a backoff time to few Geo workers to save resources. !7470 +- Persist Prometheus alert events. !7493 +- Geo: Added a button to Admin UI > Geo Nodes to open Geo Projects screen of any secondary node. !7512 +- Show Alert Thresholds on monitoring dashboards. !7538 +- Support autocomplete for commands in epics. !7588 +- Add form to enter licenses manually. !7603 +- Geo: Added `All` tab in Geo Nodes > Projects. !7745 +- Geo: Add a Geo Status Widget to Admin > Projects. !7789 +- Add data model and migration for vulnerabilities. +- Adds Batch Comments to Merge Requests [EEP]. + +### Other (8 changes, 1 of them is from the community) + +- Add runner quota information to job API. !7233 +- Resolve "ee:geo QA specs are failing as of !7210". !7315 +- remove readme checkbox from "create project" page. !7332 +- Create a generic JS function that we can apply to being able to track arbitrary events. !7403 +- Rename Admin Area Geo Nodes nav item to Geo. !7466 +- Group weight icon and text on issue list and issue boards. !7484 (George Tsiolis) +- Adds expandable/collapsable section for Snowplow. !7798 +- API: Allow issue weight parameter to be greater than or equal to zero. + + +## 11.3.14 (2018-12-20) + +- No changes. + +## 11.3.13 (2018-12-13) + +- No changes. + +## 11.3.11 (2018-11-26) + +### Security (7 changes) + +- Escape entity title while autocomplete template rendering to prevent XSS. !697 +- Properly filter private references from system notes. +- Authorize users when listing board users and milestones. +- Project groups approvers no longer leak private groups info. +- Resolve: Guest can set weight of a new issue. +- Fixes XSS with merge request approvers selection. +- Protect against CSRF attacks when adding Slack app. + + +## 11.3.10 (2018-11-18) + +- No changes. + +## 11.3.9 (2018-10-31) + +- No changes. + +## 11.3.8 (2018-10-27) + +- No changes. + +## 11.3.7 (2018-10-26) + +### Security (1 change) + +- Escape entity title while autocomplete template rendering to prevent XSS. !697 + + +## 11.3.6 (2018-10-17) + +### Fixed (1 change) + +- Don't reset the default branch when repository mirroring is enabled. !7944 + + +## 11.3.5 (2018-10-15) + +### Fixed (1 change) + +- Fix epic milestone dates incorrect after issue is linked to another epic. !7809 + + +## 11.3.4 (2018-10-05) + +### Security (1 change) + +- Properly filter private references from system notes. + + +## 11.3.3 (2018-10-04) + +- No changes. + +## 11.3.2 (2018-10-03) + +### Fixed (1 change) + +- Geo: repository shard verification job should have unique lease keys per shard name. !7474 + + +## 11.3.1 (2018-09-26) + +### Security (2 changes) + +- Project groups approvers no longer leak private groups info. +- Protect against CSRF attacks when adding Slack app. + + +## 11.3.0 (2018-09-22) + +### Security (1 change) + +- Prevent regular users from moving projects to different storage shards. + +### Fixed (29 changes, 11 of them are from the community) + +- don't add empty query params to boards. !4441 +- Geo: sync disabled wikis. !6420 +- Rails 5 fix alerts controller spec for post json parameters. !6795 (Jasper Maes) +- Fixes 500 error on user creation from admin panel with spaced username. !6804 (Jacopo Beschi @jacopo-beschi) +- Don't show search results for projects that have been deleted when using elastic search. !6830 +- Geo: Use database-cached status if redis-cached status is unavailable. !6854 +- [Geo] Fix: Custom favicons not being replicated by Geo. !6860 +- Rails5 fix AddMilestoneToLists migration rollback deleting wrong foreign key. !6865 (Jasper Maes) +- Rails5 fix passing Group objects array into for_projects_and_groups milestone scope. !6873 (Jasper Maes) +- Rails5: fix mysql milliseconds problem in project_import_state_spec. !6874 (Jasper Maes) +- Fix Jira integration duplicating branches and MRs. !6876 +- Rails5: fix mysql milliseconds problem in project_spec. !6880 (Jasper Maes) +- Remove https from Snowplow Collector URI placeholder in Admin Areawq. !6886 +- Geo: Replicate keep around refs. !6922 +- Fixes bug that prevented a user from seeing the system header and footer settings on the admin dashboard. !6926 +- Rails5 fix duplicate gpg signature in path lock spec. !6939 (Jasper Maes) +- Rails5: Fix audit event spec. !6940 (Jasper Maes) +- Rails5: fix mysql milliseconds problem in project registry spec. !6943 (Jasper Maes) +- LDAP - Does not update permissions on a read-only database. !6965 +- Rails5 fix project import spec. !6981 (Jasper Maes) +- Geo: Resolve sticky failures when attachments are missing on primary. !6991 +- Geo: LFS batch downloads are OK to be handled by secondary. !7209 +- Geo - Synchronize the default branch in secondary nodes. !7218 +- Handle fixed dates seperately from selected dates in Epics. !7227 +- Fix tooltip string to support dynamic date type in Epic sidebar. !7243 +- Fix an error in docs about fetching artifacts using API. !7244 +- Return proper status code when creation of an alert fails. !7360 (Peter Leitzen) +- Geo - Find the remote root ref using a JWT header for authentication. !7405 +- Add weight to issue hook. + +### Changed (3 changes, 1 of them is from the community) + +- Allow push_code when auth'd via Geo JWT. !6455 +- Prefer From address over Sender for Service Desk emails. !7006 (Andreas Josephson) +- Add CI Job token support to Maven packages API. !7249 + +### Performance (3 changes) + +- Reduce queries needed for CI artifacts on merge request widget. !6978 +- Use limited count approach on Protected Environments view. !6987 +- Limit sidekiq-cluster concurrency to a maximum of 50. !7025 + +### Added (15 changes, 2 of them are from the community) + +- Allow custom notification for new epic event. !5863 +- Geo: SSH git push to secondary -> proxy to Primary. !6456 +- Allow epic start/due dates to be sourceable from issue milestones. !6470 +- Add ability to upload and download maven packages from/to GitLab. !6607 +- Added an instance-level license template project. !6631 (Dan Barker) +- Add backend structure for ProtectedEnvironments. !6672 +- Add UI for GitLab private Maven repository feature. !6781 +- Add support for sorting epics. !6885 +- Allow specifying code owners in a CODEOWNERS file. !6916 +- Quick action for adding/removing epic to issues. !6934 +- Show total and completed instances deployed on deploy boards. !6955 +- Show security analysis status on the environments page. !6987 +- Add Instance Review for Core users. !6995 +- Introduce custom instance-level templates for Dockerfile, .gitignore, and .gitlab-ci.yml files. !7000 +- Adds Rubocop rule to enforce class_methods over module ClassMethods. !7044 (Jacopo Beschi @jacopo-beschi) + +### Other (4 changes) + +- Removes feature flag code surrounding Protected Environments feature. !7338 +- Creates vue component for shared runner limit. +- Allow MR authors to approve their MRs. +- Remove differences between CE and EE settings panel component. + + +## 11.2.8 (2018-10-31) + +- No changes. + +## 11.2.7 (2018-10-27) + +- No changes. + +## 11.2.6 (2018-10-26) + +### Security (1 change) + +- Escape entity title while autocomplete template rendering to prevent XSS. !698 + + +## 11.2.5 (2018-10-05) + +### Security (1 change) + +- Properly filter private references from system notes. + + +## 11.2.4 (2018-09-26) + +### Security (2 changes) + +- Project groups approvers no longer leak private groups info. +- Protect against CSRF attacks when adding Slack app. + + +## 11.2.3 (2018-08-28) + +- No changes. + +## 11.2.2 (2018-08-27) + +### Security (1 change) + +- Prevent regular users from moving projects to different storage shards. + + +## 11.2.1 (2018-08-22) + +- No changes. + +## 11.2.0 (2018-08-22) + +### Security (1 change) + +- Don't expose project names in EE counters. + +### Fixed (32 changes, 11 of them are from the community) + +- Allow Geo node to be edited once the database is failed over. !6248 +- Fix a bug where user was unable to delete a branch when repo size was above the limit. !6373 +- Rails5 fix AttachmentRegistryFinder arel queries. !6396 (Jasper Maes) +- Add Premium license checks for system messages. !6460 +- Fixes arrow-icon color and alignment in linked pipeline in merge request widget. !6479 +- Rails 5 fix the matcher expected the ApplicationSetting to be invalid, but it was valid instead. !6488 (Jasper Maes) +- Geo: Gracefully handle deleted events from Geo event log. !6506 +- Rails5 fix NoMethodError: undefined method 'message' for nil:NilClass. !6507 (Jasper Maes) +- Fix billing card title colors. !6563 +- Rails5 fix undefined method 'namespace_project_settings_repository_path'. !6581 (Jasper Maes) +- Rails5 fix no implicit conversion of Symbol into Integer. !6582 (Jasper Maes) +- Rails 5 fix NoMethodError: undefined method 'message' for nil:NilClass in host_spec.rb. !6589 (Jasper Maes) +- Fix mobile view of pod logs. !6597 +- Add left-padding to diverged-from-upstream label. !6647 +- List groups with developer maintainer access on project creation. !6678 +- no longer fail when setting up Geo database with GDK. !6680 +- Allow Pseudonymizer to write to a bucket without having permissions to see all buckets. !6682 +- Hide Expand button on empty MR widget Performance section. !6685 +- Ensure that Create issue button is shown in vulnerability dialog. !6708 +- Use same gem versions for Rails 5 as for Rails 4. !6712 (Jasper Maes) +- Rails5 correct wrong geo job name. !6713 (Jasper Maes) +- Elasticsearch: Fix a bug causing some types of note to miss being indexed. !6736 +- Rails 5 fix product array method delagation by manually calling .to_a in NotificationService. !6753 (Jasper Maes) +- Adjust self-hosted Jira development panel integration. !6756 +- Ensure that push size checks only count the size of newly-pushed files. !6767 +- Fix the UI for listing system-level labels. !6805 +- Rails5: fix slice in burndown fixture. !6813 (Jasper Maes) +- Rails5: fix Arel::UpdateManager in MigrateOldElasticsearchSettings migration. !6815 (Jasper Maes) +- Corrected URL for snowplow client side JS. !6899 +- [Geo] Fix the Storage config parameter in Geo nodes admin page. +- Fix exporting issues to CSV when sorting by label priority is used. +- Fix handling of annotated tags when Gitaly is not in use. + +### Changed (9 changes, 2 of them are from the community) + +- Add related issues loading icon top margin. !6527 (George Tsiolis) +- Add security products to usage ping. !6602 +- Changed copy for "Approved" state in merge request widget. !6635 (Constance Okoghenun) +- Track the Geo event log gaps in redis and handle them later. !6640 +- Replace clipboard icon in Service Desk settings. !6643 +- Removes "show all" on security reports and adds a button to take you to the pipeline page. !6675 +- Shows license reports when there are no reports in the source branch. !6720 +- Removes status text from licence reports. !6802 +- Opens "view full report" links in a new window. !6806 + +### Performance (2 changes) + +- Geo: Improve Geo Status API performance with cached counters in SiteStatistic. !6328 +- Geo: Improve performance in Log Cursor gap tracking. !6754 + +### Added (19 changes) + +- Geo: Add repository verification failures to API. !6137 +- Add support for todos on epics. !6142 +- Summed issue weights in board columns. !6218 +- Add an API endpoint for managed licenses of a project. !6246 +- Implement custom project templates. !6436 +- Projects page under Admin > Geo Nodes to display detailed synchronization information. !6452 +- Enables configuration of pull mirroring through API. !6485 +- Adds SLI alerts to custom prometheus metrics. !6590 +- Add support for milestones lists on the issue boards. !6615 +- Persist Epic Roadmap timescale choice. !6637 +- Add license management frontend. !6638 +- Add Snowplow integration. !6642 +- Add Security Dashboard to project quick links. !6652 +- Show License Management at pipeline level. !6688 +- Add Frontend for Instance-level project templates. !6740 +- Geo - Actively try to correct verification failures on the secondary. !6759 +- Add Prometheus metrics to track Geo autocorrect numbers. !6778 +- Link the License Management report in the MR widget with the pipeline level one. !6800 +- Allow creating assignee lists via API. + +### Other (8 changes, 1 of them is from the community) + +- Move merge requests EE helper methods. !6461 (George Tsiolis) +- Add additional logging for Geo Log Cursor. !6513 +- Ensure no weight change system notes end with a superfluous comma. !6571 +- Track registries marked as synced when repository does not found. !6694 +- Removes EE specific CSS that was moved to CE. !6723 +- Geo: Add rake task to resync projects where verification has failed. !6727 +- updates column sizes in licence and security modals. !6808 +- Geo: Log to geo.log when the Log Cursor skips an event. + + +## 11.1.7 (2018-09-26) + +### Security (2 changes) + +- Project groups approvers no longer leak private groups info. +- Protect against CSRF attacks when adding Slack app. + + +## 11.1.6 (2018-08-28) + +- No changes. + +## 11.1.5 (2018-08-27) + +- No changes. +### Security (1 change) + +- Prevent regular users from moving projects to different storage shards. + + +## 11.1.4 (2018-07-30) + +- No changes. + +## 11.1.3 (2018-07-27) + +### Fixed (1 change) + +- Resolve Environments dropdown is showing on the cluster health page. !6528 + + +## 11.1.2 (2018-07-26) + +### Security (1 change) + +- Don't expose project names in EE counters. + + +## 11.1.1 (2018-07-23) + +### Fixed (2 changes) + +- Fix geo download service ImportExportDownloader unitialized constant. !6567 +- Geo - Allow repository verification to be disabled on a secondary node. !6599 + + +## 11.1.0 (2018-07-22) + +### Removed (1 change) + +- Drop ignored Geo repository_storage_path columns. !5468 + +### Fixed (19 changes, 7 of them are from the community) + +- Log audit and Geo events within a project destroy transaction. !6059 +- Do not pre-select previous user(s) when creating protected branches. !6112 +- Group SAML settings link hidden when unlicensed. !6147 +- Geo: Fix repository/wiki sync race condition with multiple updates, especially in quick succession. !6161 +- [Rails5] Fix error on missed :authenticate_user callback. !6257 (@blackst0ne) +- Rails5 fix expected: ({...}) got: (<ActionController::Parameters {...}). !6271 (Jasper Maes) +- Rails5 fix ArgumentError: wrong number of arguments (given 1, expected 2). !6272 (Jasper Maes) +- Rails5 fix NoMethodError: undefined method `join' for "":String. !6278 (Jasper Maes) +- [Rails5] fix Boards::ListsController expected the response to have status code 200 but it was 403. !6318 (Jasper Maes) +- [Rails5] fix NoMethodError: undefined method 'downcase' for Hash. !6319 (Jasper Maes) +- [Rails5] fix Projects::VulnerabilityFeedbackController didn't match the schema. !6320 (Jasper Maes) +- Fix CI/CD pipelines when repository HEAD points to an invalid branch. !6325 +- Geo - Recalculates the checksum for projects up to date. !6333 +- Fixes an issue with security reports footers. !6450 +- Add missing sourceBranchLink prop to CI widget. !6493 +- Resync project repositories on secondaries nodes when import finishes. !6529 +- Adds permission checks to dismiss issue in security reports. +- Allow all but "/" chars for groups and projects paths on Jira dev panel integration. +- Fix weight system notes ending in commas. + +### Changed (6 changes) + +- [Geo] Invert the direction of Geo metrics acquisition. !5934 +- Update read-only message banner styling for Geo secondary node. !6135 +- Removes action buttons from resolved vulnerability modal. !6155 +- Redesign contribution analytics graphs. !6194 +- Geo - Retry checksum calculation for failures on the primary node. !6295 +- Don't show 'Contribute to GitLab' link on self-hosted Enterprise Edition instances. !6297 + +### Performance (5 changes, 1 of them is from the community) + +- Geo - Optimize query to return outdated projects that need to be reverified. !5879 +- Boost Geo prune worker to run every 2 hours instead of 6. !6074 +- Use tooltip component in MrWidgetSecondaryGeoNode vue component. !6078 (George Tsiolis) +- Eliminate N+1 queries in path lock checks during a push. +- Memoize the global default for push rules within the request. + +### Added (13 changes, 1 of them is from the community) + +- Add a new push rule to allow negative matching of commit messages. !5453 (Hannes Rosenögger) +- Pseudonymizer to safely export data for analytics. !5532 +- Add filename filtering to code search with Elasticsearch. !5590 +- Add API endpoint for viewing and editing board config. !5954 +- Log repository check and failed count to Prometheus. !5984 +- Allow repository verification concurrency to be controlled on primary and secondary. !6102 +- Geo: HTTP git-lfs push (upload) and locks (verify, lock and unlock) to secondary now redirects to the primary. !6109 +- Adds pod selection dropdown to pod logs screen. !6111 +- Add support for autocompleting Epics and Labels within Epics. !6195 +- Add project Security Dashboard. !6197 +- Support GitLab subgroups in Jira development panel. !6290 +- Render container scanning and dast reports in pipeline view. +- Add link to Jenkins documentation within integration and service template. + +### Other (2 changes) + +- Enable Geo snapshot synchronization for everyone. !6286 +- Geo - Make Geo repository verification flag opt-out by default. !6369 + + +## 11.0.6 (2018-08-27) + +### Security (1 change) + +- Prevent regular users from moving projects to different storage shards. + + +## 11.0.5 (2018-07-26) + +### Security (1 change) + +- Don't expose project names in EE counters. + + +## 11.0.4 (2018-07-17) + +- No changes. + +## 11.0.3 (2018-07-05) + +- No changes. + +## 11.0.2 (2018-06-26) + +- No changes. + +## 11.0.1 (2018-06-21) + +- No changes. + +## 11.0.0 (2018-06-22) + +### Security (2 changes) + +- Escape name in merge request approvers dropdown. +- Fixes include directive to not allow SSRF requests. + +### Fixed (15 changes) + +- Hide Lock button if File Locking feature is not available in license. !5656 +- Geo - Move out the replication slots items from verification section in Geo admin screen. !5723 +- Fix approvers API not accepting empty form-encoded params. !5784 +- Fix error when locking/unlocking directories. !5862 +- Geo: Formatting fix for geo:status rake task. !6020 +- Geo: Automatically clean up stale lock files on Geo secondary. !6034 +- Remove LFS object warning from import UI. !6083 +- Fix Web IDE status bar if System Footer message is present. +- [Geo] Fix: Deleted project events may be skipped on the secondary when selective sync is used. +- [Geo] Fix: Unauthenticated rate limits should not block Geo requests. +- Perform gitlab-ci-token authentication always using primary. +- Geo: Gracefully handle a non-JSON response from the node status. +- Geo: Fix FDW schema check when tables and columns are not in the same order. +- Fix sticking of runner to primary if new job is scheduled. +- When last Geo::EventLog is not available, geo:status rake task fails. + +### Deprecated (2 changes) + +- Rename Container Scanning job and artifact. !5770 +- Rename Code Quality job and artifact. !5773 + +### Changed (7 changes) + +- Removed "(Beta)" from "Auto DevOps" messages. !5583 +- Make issue weight promotion in issuable sidebar dismissable. !5601 +- Remove the comma from the weight system notes. !5854 +- Enrich Security Reports with more data. !5878 +- Truncate Geo event log with a delay. !5897 +- Add support for non-negative integer weight values in issuable sidebar. +- Improve Failed Jobs tab in the Pipeline detail page. + +### Performance (5 changes, 2 of them are from the community) + +- Reorder LinkToMemberAvatar vue component props values. !5692 (George Tsiolis) +- Rename merge request widget author component. !5693 (George Tsiolis) +- Geo - Fix index for outdated projects on the project_repository_states table. !5986 +- Preload Group plans in EpicsFinder. +- Only process Geo::EventLog events if associated shard is queryable and healthy. + +### Added (12 changes) + +- Allows the review of kubernetes pod logs within GitLab. !4752 +- Geo: Rake task to force housekeeping on next sync. !5623 +- Add ability to have zero approvers. !5635 +- Show status information stale icon in Geo admin dashboard. !5653 +- Add assignee board list type. !5743 +- Geo: HTTP git push to secondary now redirects to the primary. !5785 +- Add presets for navigating Epic Roadmap. !5798 +- Guest users will not consume seats quote in Ultimate plan. !5816 +- Create system note on epic date change. +- Add License Management results in the MR widget. +- Extract EE specific files. +- Add service discovery for the DB load balancer. + +### Other (4 changes, 1 of them is from the community) + +- Add promotion for epics to issuable sidebar. !5601 +- Remove confusing statement in the message shown for Epics list empty state when filters are applied. !5630 +- Fixed illustration alignment for group milestones promotion. !5677 (Constance Okoghenun) +- Allow viewing only one when multiple issue boards is not enabled. + + +## 10.8.6 (2018-07-17) + +- No changes. + +## 10.8.5 (2018-06-21) + +- No changes. + +## 10.8.4 (2018-06-06) + +### Fixed (4 changes) + +- Render a 403 when showing an access denied message. !5964 +- Validate classification label on create & update. !5976 +- Fix breadcrumbs being covered by System Header message. +- Treat external authorization service response status 403 as failure. + + +## 10.8.3 (2018-05-30) + +- No changes. +- No changes. +### Fixed (1 change) + +- Geo - Calculate the wiki checksum even when wiki is disabled. !5772 + +### Performance (1 change) + +- Make Geo::PruneEventLogWorker delete rows more gently. !5835 + + +## 10.8.2 (2018-05-28) + +### Security (3 changes) + +- Fixed XSS in protected branches & tags access dropdown. +- Escape name in merge request approvers dropdown. +- Fixes include directive to not allow SSRF requests. + + +## 10.8.1 (2018-05-23) + +### Fixed (4 changes) + +- Geo: Fix repo, wiki, and upload replication when renaming a namespace that has subgroups. !5704 +- Shows the correct data in the verification information section for the primary node in Geo admin screen. !5722 +- [Geo] Don't remove project registry records. +- Geo: Exclude tables that start with pg_ from FDW check. + + +## 10.8.0 (2018-05-22) + +### Removed (1 change) + +- Use of ENV['USE_SYSTEM_GIT_FOR_FETCH'] is no longer supported. + +### Fixed (22 changes) + +- Add missing fields to the API documentation for the status of Geo Nodes. !3865 +- Large pushes were failing when max file size push rule was active. !4989 +- Fix GITLAB_FEATURES CI/CD env var for public projects. !5242 +- Reveal labels dropdown when labels icon is clicked on collapsed Epic sidebar. !5298 +- Geo: Propagate broadcast messages to secondaries. !5303 +- Geo: Exclude expired job artifacts from syncing and counts. !5380 +- Exclude GroupSAML from sign in buttons. !5449 +- Per-Group SAML (for GitLab.com) strips LRM chars from ADFS certificate fingerprints. !5466 +- Refactor the Geo LogCursor Logger to make class more descriptive. !5483 +- Geo - Returns a dummy checksum when there is no valid repository on disk. !5486 +- ShaAttribute no longer stops startup if database is missing. !5502 +- Fix network error message styling on Geo admin dashboard. !5530 +- Fixes invalid link in html version of mirror was hard failed email. !5546 +- During repository verification, ignore repositories/wikis that need to be resynced. !5568 +- Group SAML skips forgery protection in production. !5621 +- Does not log failed sign-in attempts when in a GitLab read-only instance. !5643 +- [Geo] Fix rake geo:status when event_log is not found. +- Geo: Use a pre-built node status in admin area. +- [Geo] Mentioned in custom hooks doc that they won't be replicated to secondary. +- Fix: Geo: BaseSyncService should prune the @geo-temporary directory before fetching. +- Stop presenting burndown charts promotion for grouped by title milestones. +- Geo: When a repository or Wiki sync has failed, mark resync flag as true. + +### Changed (13 changes, 1 of them is from the community) + +- Shorten protected branch / tag access level dropdown text. !5091 +- Improve tooltips on collapsible right sidebars. !5212 +- Allow easier customization of included CI configurations. !5288 (King Chung Huang) +- Unprotect and update disabled in UI when prevented by branch unprotect rules. !5296 +- Issues export CSV includes 'Weight' and 'Locked'. !5300 +- Update item titles and add help text in Geo nodes admin dashboard. !5306 +- Geo - Improve metrics for the checksum/verification feature. !5367 +- Adds push mirrors to GitLab Community Edition. !5484 +- Adds SSO page for GitLab.com per group SAML beta. !5508 +- Adds authentication flow for GitLab.com per group SAML beta. !5575 +- Add Geo information to console message. !5588 +- Ability to edit, disable or remove Geo Nodes is now always available. +- Show pod name for each instance on deploy boards. + +### Performance (4 changes) + +- Port Group member contribution analytics table to Vue. !5269 +- Improve performance of repository size limit check. !5476 +- Improves database performance of mirrors, forks and imports. !5522 +- Prevent Geo from unnecessarily syncing expired CI job artifacts. + +### Added (11 changes) + +- Geo: schedule a git repack after initial clone. !4266 +- Present Burndown charts for group milestones. !5354 +- Filtered search bar support for Roadmap view. !5417 +- Allow user to dismiss a vulnerability or create an issue out of it. !5452 +- Geo: enable housekeeping functionality when syncing repositories. !5461 +- Enable username autocomplete inside Epics. !5475 +- Present MRs on Jira development panel integration. !5534 +- Run repository verification on Geo secondary. !5550 +- Email notifications for epics. +- Add Epic count to usage pings. +- Add system note for weight change. + +### Other (6 changes, 6 of them are from the community) + +- Replace the `admin/license.feature` spinach test with an rspec analog. !5477 (@blackst0ne) +- Replace the `admin/push_rules.feature` spinach test with an rspec analog. !5512 (@blackst0ne) +- Replace the `admin/emails.feature` spinach test with an rspec analog. !5513 (@blackst0ne) +- Replace the `group_hooks.feature` spinach test with an rspec analog. !5515 (@blackst0ne) +- Replace the `groups_management.feature` spinach test with an rspec analog. !5516 (@blackst0ne) +- Remove `features/group_active_tab.feature`. !5554 (@blackst0ne) + + +## 10.7.7 (2018-07-17) + +- No changes. + +## 10.7.6 (2018-06-21) + +- No changes. + +## 10.7.5 (2018-05-28) + +### Security (3 changes) + +- Fixed XSS in protected branches & tags access dropdown. +- Escape name in merge request approvers dropdown. +- Fixes include directive to not allow SSRF requests. + + +## 10.7.4 (2018-05-21) + +### Fixed (2 changes) + +- Does not log failed sign-in attempts when in a GitLab read-only instance. !5643 +- Fix: Geo: BaseSyncService should prune the @geo-temporary directory before fetching. + + +## 10.7.3 (2018-05-02) + +### Fixed (3 changes) + +- Geo - Fix undefined method pending_delete for nil class. !5470 +- Geo: Admin page will not crash with 500 because of InvalidSignatureTimeError. !5495 +- Fix DB LB errors when escaping input. + + +## 10.7.2 (2018-04-25) + +- No changes. + +## 10.7.1 (2018-04-23) + +### Fixed (4 changes) + +- Geo: Fix enabled wiki counts with FDW (impacts synced and verified counts). !5352 +- Fix Epic timeline bar misalignment when start date is in last timeframe month and end date is out of range. !5360 +- Adds border top to codeclimate report in MR widget. +- Avoid wrong closing dates being caught by the query on Burndown charts. + +### Performance (1 change) + +- Geo - Improve the query performance to find unverified projects on primary node. !5348 + + +## 10.7.0 (2018-04-22) + +### Fixed (25 changes) + +- Issue Boards: Ensure that horizontal scroll bars are shown on overflow. !4944 +- Fix validation error message when historical data is empty. !4961 +- Fixes incorrect assignation of cluster details. !5047 +- Fixed personal snippets uploads when background upload is enabled. !5049 +- Fixed incorrect count of verified wikis on a Geo secondary node. !5084 +- Fix unapproved unassigned merge request emails failing to send. !5092 +- Geo secondary repository verification messages now appear in geo.log. !5095 +- Geo: Sync wiki when it is enabled. !5139 +- Geo: Make synced/failed scopes more consistent. !5171 +- Updates style of arrown in downstream pipeline. !5172 +- Add better LDAP connection handling in EE and fixing some LDAP group syncing problems. !5173 +- Fix an exception in the Geo repository sync worker. !5223 +- Geo - Fix wiki repository verification on a secondary node. !5315 +- Show repository checksum UI elements only when feature is enabled. !5341 +- Fix a bug migrating CI job artifact registry entries to a separate table. !5345 +- Render show all report for sast and dependency scanning. !5363 +- Fix label and issuable referencing in epics and epic notes. +- Add icons to epic system notes issue actions. +- [Geo] Fix project rename when wiki does not exist. +- Catch errors in LoadBalancing::Host#online?. +- Fix Scoped Boards bug filtering by No Milestone. +- Skip repository-changing events on Geo secondaries if the repository hasn't been backfilled yet. +- Ensure Geo secondary nodes only run cron jobs appropriate for secondaries. +- Geo - Returns a dummy checksum when there is no repository on disk. +- Fix Elasticsearch missing terms with special characters. + +### Deprecated (1 change) + +- Rename SAST:container to Container Scannning. + +### Changed (9 changes) + +- Geo - Perform the repository verification per shard on a secondary node. !5068 +- Allow enabling classification policy control without external authorization service. !5083 +- Update Geo nodes layout for better usability. !5199 +- Document manual disaster recovery process for systems with multiple secondaries. +- Don't send schedule confirmations for chat jobs. +- Geo - Switch from time-based checking of outdated checksums to the nil-checksum-based approach. +- Make /-/ delimiter optional for epics and search endpoints. +- Order boards dropdown alphabetically. +- Renders grouped security reports in MR widget & split security reports in CI view. + +### Performance (3 changes) + +- Geo - Improve the query performance to find unsynced job artifacts. !5350 +- Reimplement Roadmap timeline rendering for better performance. +- Geo: Migrate CI job artifacts into their own registry table. + +### Added (11 changes) + +- Geo ensure files moved to object storage are cleaned up. !4689 +- Timeout for external authorization is now configurable. !4971 +- Add system header and footer as new appearance options. !4972 +- Authenticate using TLS certificate for requests to external authorization service. !5028 +- Add admin setting for custom additional text in emails. !5031 +- Mark files missing on primary as synced, but retry them. !5050 +- Log every access when external authorization is enabled. !5117 +- Add total CPU/Memory metrics, adds weighting for proper sorting. !5260 +- Add comment thread to Epics. +- Render dependency scanning in MR widget and CI view. +- Add a Go back button to WebIDE to allow returning to where it was launched from. + +### Other (4 changes, 1 of them is from the community) + +- Move default group project creation level to Starter. !5148 +- Replace the `project/issues/weight.feature` spinach test with an rspec analog. !5194 (blackst0ne) +- [Geo] Log JID for sync related jobs. +- Breaks utils function to parse codeclimate and sast into separate functions. + + +## 10.6.6 (2018-05-28) + +### Security (3 changes) + +- Fixed XSS in protected branches & tags access dropdown. +- Escape name in merge request approvers dropdown. +- Fixes include directive to not allow SSRF requests. + + +## 10.6.5 (2018-04-24) + +- No changes. + +## 10.6.4 (2018-04-09) + +### Fixed (4 changes) + +- Fixes incorrect assignation of cluster details. !5047 +- Geo: Make synced/failed scopes more consistent. !5171 +- [Geo] Fix project rename when wiki does not exist. +- Fix Scoped Boards bug filtering by No Milestone. + +### Other (1 change) + +- [Geo] Log JID for sync related jobs. + + +## 10.6.3 (2018-04-03) + +- No changes. + +## 10.6.2 (2018-03-29) + +- No changes. + +## 10.6.1 (2018-03-27) + +### Fixed (8 changes) + +- Fix LDAP group sync permission override UI. !5003 +- Hard failing a mirror no longer fails for a blocked user's personal project. !5063 +- Geo - Avoid rescheduling the same project again in a backfill condition. !5069 +- Mark disabled wikis as fully synced. !5104 +- Fix excessive updates to file_registry when wiki is disabled. !5119 +- Geo: Recovery from temporary directory doesn't work if the namespace directory doesn't exist. +- Define a chat responder for the Slack app. +- Resolve "undefined method 'log_transfer_error'". + +### Added (1 change) + +- Also log Geo Prometheus metrics from primary. !5058 + +### Other (1 change) + +- Update Epic documentation to include labels. + + +## 10.6.0 (2018-03-22) + +### Security (2 changes) + +- Prevent new push rules from using non-RE2 regexes. +- Project can no longer be shared between groups when both member and group locks are active. + +### Fixed (47 changes) + +- Geo - Add a rake task to update Geo primary node URL. !4097 +- Capture push rule regex errors and present them to user. !4102 +- Fixed membership Lock should propagate from parent group to sub-groups. !4111 +- Fix Epic sidebar toggle button icon positioning. !4138 +- Update the Geo documentation to replicate all secrets to the secondary. !4188 +- Update Geo documentation to reuse the primary node SSH host key on secondary node. !4198 +- Improve Geo Disaster Recovery docs for systems in multi-secondary configurations. !4285 +- Fix 500 errors caused by large replication slot wal retention. !4347 +- Report the correct version and revision for Geo node status requests. !4353 +- Don't show Member Lock setting for unlicensed system. !4355 +- Fix the background_upload configuration being ignored. !4507 +- Fix canary legends for single series charts. !4522 +- Fixes and enhancements for Geo admin dashboard. !4536 +- Fix license expiration duration to show trial info only for trial license. !4573 +- File uploads in remote storage now support project renaming. !4597 +- Use unique keys for token inputs while add same value twice to an epic. !4618 +- Fix multiple assignees avatar alignment in issues list. !4664 +- Improve security reports to handle big links and to work on mobile devices. !4671 +- Supresses error being raised due to async remote removal being run outside a transaction. !4747 +- Mark empty repos as synced in Geo. !4757 +- Mirror owners now get assigned as mirror users when the assigned mirror users disable their accounts. !4827 +- Geo: Ignore remote stored objects when calculating counts. !4864 +- Fix Epics not getting created in a Group with existing Epics. !4865 +- Generate ObjectStorage URL based on user provided schema. !4932 +- Make Epic start and finish dates on Roadmap to be timezone neutral. !4964 +- Support SendURL for performing indirect download of artifacts if clients does not specify that it supports that. +- Fix LDAP group sync no longer configurable for regular users. +- [Geo] Skip attachments that is stored in the object storage. +- Fix: Geo WikiSyncService attempts to sync projects that have no Wiki. +- Fix broken CSS in modal for DAST report. +- Improve SAST description for no new vulnerabilities. +- Fix 'Geo: Don't attempt to expire the cache after a failed clone'. +- Geo - Remove duplicated message on on geo:update_primary_node_url rake task. +- Fix the geo::db:seeds rake task. +- Geo - Fix repository synchronization order for projects updated recently. +- Geo - Respect backoff time when repository have never been synced successfully. +- Ensure mirror can transition out of the started state when last_update_started_at is nil. +- Fix bug causing 'Import in progress' to be shown while a mirror is updating. +- Include epics from subgroups on Epic index page. +- Fix proxy_download support for lfs controller. +- Fixed IDE command palette options being hidden. +- Fixed IDE file list when multiple files have same name but different paths. +- Fixed IDE not showing the correct changes and diff markers. +- Update epic issue reference when moving an issue. +- Fix Geo Log Cursor not reconnecting after pgbouncer dies. +- Fix audit and Geo project deletion events not being logged under certain conditions. +- Geo: Fix Wiki resync when Wiki repository does not exist. + +### Changed (15 changes) + +- Geo Logger will use the same log level defined in Rails. !4066 +- Approve merge requests additionally. !4134 +- Geo: sync .gitattributes to info/attributes in secondary nodes. !4159 +- Update behavior of MR widgets that require pipeline artifacts to allow jobs with multiple artifacts. !4203 +- Add details on how to disable GitLab to the DR documentation. !4239 +- Add users stats page for admin area with per role amount. !4539 +- Group Roadmap enhancements. !4651 +- Adds support to show added, fixed and all vulnerabilties for SAST in merge request widget. +- Ports remote removal to a background job. +- Update UI for merge widget reports. +- Geo: Improve formatting of can't push to secondary warning message. +- Replace check_name key with description in codeclimate results for a more human readable description. +- Add license ID number to usage ping. +- Schedule mirror updates in parallel. +- Geo: Don't attempt to schedule a repository sync for downed Gitaly shards. + +### Performance (8 changes, 3 of them are from the community) + +- Move Assignees vue component. !4467 (George Tsiolis) +- Speed up approvals calculations. !4492 +- Move BoardNewIssue vue component. !16947 (George Tsiolis) +- Move RecentSearchesDropdownContent vue component. !16951 (George Tsiolis) +- Bump Geo JWT timeout from 1 minute to 10 minutes. +- Cache column_exists? for Elasticsearch columns. +- FIx N+1 queries with /api/v4/groups endpoint. +- Properly memoize ChangeAccess#validate_path_locks? to avoid excessive queries. + +### Added (39 changes, 1 of them is from the community) + +- Add ability to add Custom Metrics to environment and deployment metrics dashboards. !3799 +- Add object storage support for uploads. !3867 +- Add support within Browser Performance Testing for metrics where smaller is better. !3891 (joshlambert) +- Add more endpoints for Geo Nodes API. !3923 +- (EEP) Allow developers to create projects in group. !4046 +- Integrate current File Locking feature with LFS File Locking. !4091 +- Add Epic information for selected issue in Issue boards sidebar. !4104 +- Update CI/CD secret variables list to be dynamic and save without reloading the page. !4110 +- Add object storage migration task for uploads. !4215 +- Filtered search support for Epics list page. !4223 +- Add multi-file editor usage metrics. !4226 +- Dry up CI/CD gitlab-ci.yml configuration by allowing inclusion of external files. !4262 +- Geo: FDW issues are displayed in the Geo Node Admin UI. !4266 +- Implement selective synchronization by repository shard for Geo. !4286 +- Show Group level Roadmap. !4361 +- Add Geo Prometheus metrics about the various number of events. !4413 +- Geo - Calculate repositories checksum on primary node. !4428 +- If admin note exists, display it in admin user view. !4546 +- Add option to overwrite diverged branches for pull mirrors. !4559 +- Adds GitHub Service to send status updates for pipelines. !4591 +- Projects and MRs Approvers API. !4636 +- Add CI/CD for external repositories. !4642 +- Authorize project access with an external service. !4675 +- GitHub CI/CD import sets up pipeline notification integration. !4687 +- Add GitHub support to CI/CD for external repositories. !4688 +- Repository mirroring notifies when hard failed. !4699 +- Query cluster status. !4701 +- Geo - Verify repository checksums on the secondary node. !4749 +- Move support of external gitlab-ci files from Premium to Starter. !4841 +- Geo - Improve node status report by adding one more indicator of health: last time when primary pulled the status of the secondary. +- Render SAST report in Pipeline page. +- Add system notes when moving issues between epics. +- Add rake task to print Geo node status. +- Add basic searching and sorting to Epics API. +- gitlab:geo:check checks connection to the Geo tracking DB. +- Added basic implementation of GitLab Chatops. +- Add discussions API for Epics. +- Add proxy_download to enable passing all data through Workhorse. +- Add support for direct uploading of LFS artifacts. + +### Other (8 changes) + +- Geo: Improve replication status. Using pg_stat_wal_receiver. +- Remove unaproved typo check in sast:container report. +- Allow clicking on Staged Files in WebIDE to open them in the Editor. +- Translate Locked files page. +- Increase minimum mirror update interval from 15 to 30 minutes. +- Geo - add documentation about using shared a S3 bucket with GitLab Container Registry. +- Allow use of system git for git fetch if USE_SYSTEM_GIT_FOR_FETCH is defined. +- Rename "Approve Additionally" to "Add approval". + + +## 10.5.8 (2018-04-24) + +- No changes. + +## 10.5.7 (2018-04-03) + +- No changes. + +## 10.5.6 (2018-03-16) + +- No changes. + +## 10.5.5 (2018-03-15) + +### Fixed (1 change) + +- Geo: Fix Wiki resync when Wiki repository does not exist. + + +## 10.5.4 (2018-03-08) + +### Fixed (4 changes) + +- Supresses error being raised due to async remote removal being run outside a transaction. !4747 +- Mark empty repos as synced in Geo. !4757 +- Fix: Geo WikiSyncService attempts to sync projects that have no Wiki. +- Geo - Fix repository synchronization order for projects updated recently. + +### Other (1 change) + +- Rename "Approve Additionally" to "Add approval". + + +## 10.5.3 (2018-03-01) + +### Security (2 changes) + +- Project can no longer be shared between groups when both member and group locks are active. +- Prevent new push rules from using non-RE2 regexes. + +### Fixed (1 change) + +- Fix LDAP group sync no longer configurable for regular users. + + +## 10.5.2 (2018-02-25) + +- No changes. + +## 10.5.1 (2018-02-22) + +- No changes. + +## 10.5.0 (2018-02-22) + +### Fixed (23 changes, 1 of them is from the community) + +- Geo - Add a rake task to update Geo primary node URL. !4097 +- Capture push rule regex errors and present them to user. !4102 +- Fixed membership Lock should propagate from parent group to sub-groups. !4111 +- Fix Epic sidebar toggle button icon positioning. !4138 +- Update the Geo documentation to replicate all secrets to the secondary. !4188 +- Update Geo documentation to reuse the primary node SSH host key on secondary node. !4198 +- Override group sidebar links. !4234 (George Tsiolis) +- Improve Geo Disaster Recovery docs for systems in multi-secondary configurations. !4285 +- Fix 500 errors caused by large replication slot wal retention. !4347 +- Report the correct version and revision for Geo node status requests. !4353 +- Don't show Member Lock setting for unlicensed system. !4355 +- Fix the background_upload configuration being ignored. !4507 +- Geo: Reset force_redownload flag after successful sync. +- [Geo] Skip attachments that is stored in the object storage. +- [Geo] Fix redownload repository recovery when there is not local repo at all. +- Fix broken CSS in modal for DAST report. +- Improve SAST description for no new vulnerabilities. +- Geo - Remove duplicated message on on geo:update_primary_node_url rake task. +- Fix the geo::db:seeds rake task. +- Allow project to be set up to push to and pull from same mirror. +- Include epics from subgroups on Epic index page. +- Fix validation of environment scope of variables. +- Support SendURL for performing indirect download of artifacts if clients does not specify that it supports that. + +### Changed (9 changes) + +- Geo Logger will use the same log level defined in Rails. !4066 +- Approve merge requests additionally. !4134 +- Geo: sync .gitattributes to info/attributes in secondary nodes. !4159 +- Update behavior of MR widgets that require pipeline artifacts to allow jobs with multiple artifacts. !4203 +- Add details on how to disable GitLab to the DR documentation. !4239 +- Ports remote removal to a background job. +- Adds support to show added, fixed and all vulnerabilties for SAST in merge request widget. +- Geo: Don't attempt to schedule a repository sync for downed Gitaly shards. +- Update UI for merge widget reports. + +### Performance (3 changes) + +- Bump Geo JWT timeout from 1 minute to 10 minutes. +- FIx N+1 queries with /api/v4/groups endpoint. +- Properly memoize ChangeAccess#validate_path_locks? to avoid excessive queries. + +### Added (17 changes, 1 of them is from the community) + +- Add object storage support for uploads. !3867 +- Add support within Browser Performance Testing for metrics where smaller is better. !3891 (joshlambert) +- Add more endpoints for Geo Nodes API. !3923 +- (EEP) Allow developers to create projects in group. !4046 +- Integrate current File Locking feature with LFS File Locking. !4091 +- Add Epic information for selected issue in Issue boards sidebar. !4104 +- Update CI/CD secret variables list to be dynamic and save without reloading the page. !4110 +- Add object storage migration task for uploads. !4215 +- Filtered search support for Epics list page. !4223 +- Add multi-file editor usage metrics. !4226 +- Dry up CI/CD gitlab-ci.yml configuration by allowing inclusion of external files. !4262 +- Implement selective synchronization by repository shard for Geo. !4286 +- Show Group level Roadmap. !4361 +- Add Geo Prometheus metrics about the various number of events. !4413 +- Geo - Improve node status report by adding one more indicator of health: last time when primary pulled the status of the secondary. +- Add rake task to print Geo node status. +- Add system notes when moving issues between epics. + +### Other (3 changes) + +- Activated the Web IDE Button also on the main project page. !4250 +- Geo - add documentation about using shared a S3 bucket with GitLab Container Registry. +- Geo: Improve replication status. Using pg_stat_wal_receiver. +- Remove unaproved typo check in sast:container report. + + +## 10.4.7 (2018-04-03) + +- No changes. + +## 10.4.6 (2018-03-16) + +- No changes. + +## 10.4.5 (2018-03-01) + +### Security (2 changes) + +- Project can no longer be shared between groups when both member and group locks are active. +- Prevent new push rules from using non-RE2 regexes. + +### Fixed (1 change) + +- Fix LDAP group sync no longer configurable for regular users. + + +## 10.4.4 (2018-02-16) + +### Fixed (4 changes) + +- Handle empty event timestamp and larger memory units. !4206 +- Geo: Reset force_redownload flag after successful sync. +- [Geo] Fix redownload repository recovery when there is not local repo at all. +- Allow project to be set up to push to and pull from same mirror. + + +## 10.4.3 (2018-02-05) + +### Security (1 change) + +- Restrict LDAP API to admins only. + + +## 10.4.2 (2018-01-30) + +### Fixed (7 changes) + +- Fix Epic issue item reordering to handle different scenarios. !4142 +- Fix visually broken admin dashboard until license is added. !4196 +- Handle empty event timestamp and larger memory units. !4206 +- Use a fixed remote name for Geo mirrors. !4249 +- Preserve updated issue order to store when reorder is completed. !4278 +- Geo - Fix OPENSSH_EXPECTED_COMMAND in the geo:check rake task. +- Execute group hooks after-commit when moving an issue. + + +## 10.4.1 (2018-01-24) + +### Fixed (1 change) + +- Fix failed LDAP logins when sync_ssh_keys is included in config. + + +## 10.4.0 (2018-01-22) + +### Security (2 changes) + +- Fix LDAP external user/group bug on first sign in. +- Deny persisting milestones from outside project/group scope on boards. + +### Fixed (19 changes, 1 of them is from the community) + +- Issue count now refreshes quicker on geo secondary. !3639 +- Prevent adding same role multiple times on repeated clicks. !3700 +- Geo - Fix difference in FDW / non-FDW queries for Geo::FileRegistry queries. !3714 +- Fix successful rebase throwing flash error message. !3727 +- Fix Merge Rquest widget rebase action in Internet Explorer. !3732 +- Geo - Use relative path for avatar images on a secondary node. !3857 +- Add missing wiki counts to prometheus metrics. !3875 +- Adjust content width for User Settings, Pipeline quota. !3895 (George Tsiolis) +- Fix a bug where branch could not be delete due to a push rule config. !3900 +- Fix a few doc links to fast ssh key lookup. !3937 +- Handle node details load failure gracefully on UI. !3992 +- Use the fastest available method for various Geo status counts. !4024 +- Fix neutralCount computation to prevent negative values. !4044 +- Fix reordering of items when moved to top or bottom. !4050 +- Geo - Fix repository clean up when selective replication changes with hashed storage enabled. !4059 +- Fix JavaScript bundle running on Cluster update/destroy pages. !4112 +- Record EE instances without a license correctly in usage ping. +- Fix export to CSV if a filter with multiple labels is used. +- Stop authorization attempts with instance profile when static credentials are provided for AWS Elasticsearch. + +### Changed (6 changes) + +- Change MR widget failed icons to warning icons. !3669 +- Show clear message when set-geo-primary-node was successful. !3768 +- More descriptive error when clocks between Geo nodes are out of sync. !3860 +- Allow sidekiq to react to becoming a Geo primary or secondary without a restart. !3878 +- Geo admin screen enhancements. !3902 +- Geo UI polish. + +### Added (13 changes) + +- Split project repository and wiki repository status in Geo node status. !3560 +- Add reset pipeline minutes button to admin overview of groups and users. !3656 +- Show results from docker image scan in the merge request widget. !3672 +- Geo: Added Authorized Keys specific checks. !3728 +- Add some extra fields to Geo API node and status. !3858 +- Show results from DAST scan in the merge request widget. !3885 +- Add Geo support for CI job artifacts. !3935 +- Make it possible to enable/disable PostgreSQL FDW for Geo. !4020 +- Add support for reordering issues in epics. +- Check if shard configuration is same across Geo nodes. +- Add API for epics. +- Add group boards API endpoint. +- Add api for epic_issue associations. + +### Other (6 changes) + +- Document GitLab Geo with Object Storage. !3760 +- Update disaster recovery documentation with detailed steps. !3845 +- Fix broken alignment of database password in geo docs. !3939 +- Remove unnecessary NTP checks now included in gitlab:geo:check. !3940 +- Move geo status check after db replication to avoid anticipated failures. !3941 +- Make scoped issue board specs more reliable. + + +## 10.3.9 (2018-03-16) + +- No changes. + +## 10.3.8 (2018-03-01) + +### Security (2 changes) + +- Project can no longer be shared between groups when both member and group locks are active. +- Prevent new push rules from using non-RE2 regexes. + +### Fixed (1 change) + +- Fix LDAP group sync no longer configurable for regular users. + + +## 10.3.7 (2018-02-05) + +### Security (1 change) + +- Restrict LDAP API to admins only. + +### Fixed (1 change) + +- Fix JavaScript bundle running on Cluster update/destroy pages. + + +## 10.3.6 (2018-01-22) + +### Fixed (3 changes) + +- Geo - Fix repository clean up when selective replication changes with hashed storage enabled. !4059 +- Fix JavaScript bundle running on Cluster update/destroy pages. !4112 +- Fix export to CSV if a filter with multiple labels is used. + + +## 10.3.5 (2018-01-18) + +- No changes. + +## 10.3.4 (2018-01-10) + +### Security (2 changes) + +- Fix LDAP external user/group bug on first sign in. +- Deny persisting milestones from outside project/group scope on boards. + + +## 10.3.3 (2018-01-02) + +- No changes. + +## 10.3.2 (2017-12-28) + +- No changes. + +## 10.3.1 (2017-12-27) + +### Changed (1 change) + +- Geo: Show sync percent on bar graph and count within tooltips. !3794 + + +## 10.3.0 (2017-12-22) + +### Removed (2 changes) + +- Remove the full-scan option from the Geo log cursor. !3412 +- Remove Geo SSH repo sync support. !3553 + +### Fixed (14 changes) + +- Hide Approvals section when Merge Request Widget is showing the empty state. !3376 +- Fix error when entering an invalid url to push to or pull from a remote repository. !3389 +- Update gitlab.yml.example to match the default settings for Geo sync workers. !3488 +- Remove duplicate read-only flash message on admin pages. !3495 +- Strip leading & trailing whitespaces in CI/CD secret variable's environment scope. !3563 +- Fix Advanced Search Syntax documentation. !3571 +- Fix Git message when pushing to Geo secondary. !3616 +- Fix a bug in the Geo metrics update service. !3623 +- Fix validation of environment scope for Ci::Variable. !3641 +- Fix an exception in Geo scheduler workers. !3740 +- Fix Merge Request Widget Approvals responsiveness on mobile. +- Geo - Does not sync repositories on unhealthy shards in non-backfill conditions. +- Record EE Ultimate usage pings correctly. +- Fix board filter for predefined milestones. + +### Changed (4 changes) + +- Improve Geo logging of repository errors. !3402 +- ProtectedBranches API allows individual users and group to be specified. !3516 +- EE Protected Branches API access levels include user_id/group_id where relevant. !3535 +- Enhancements for Geo admin screen. !3545 + +### Performance (1 change) + +- Geo - Improve performance when calculating the node status. !3595 + +### Added (20 changes) + +- Show SAST results in MR widget. !3207 +- Add option for projects to only mirror protected branches. !3326 +- Add option to remote mirrors to only push protected branches. !3350 +- Add warning when Geo is configured insecurely. !3368 +- Added enpoint that triggers the pull mirroring process. !3453 +- Add performance metrics to the merge request widget. !3507 +- Geo: replicate Attachments migration to Hashed Storage in secondary node. !3544 +- View, add, and edit weight on Issue from the Issue Board contextual sidebar. !3566 +- Decrease scheduling delay and add rate limiting to push mirror. !3575 +- Allow admins to disable mirroring. !3586 +- Support multiple Kubernetes cluster per project. !3603 +- Geo: Increase parallelism by scheduling project repositories by shard. !3606 +- Geo: rake task to refresh foreign table schema (FDW support). !3626 +- Support mentioning epics. +- Handle outdated replicas in the DB load balancer. +- Add geo:set_secondary_as_primary rake task. +- Transfer job archives to object storage after creation. +- Geo - Show GitLab version for each node in the Geo status page. +- Add epic information to issue sidebar. +- Add system notes for issue - epic association. + +### Other (3 changes) + +- Add fade mask to the bottom of the boards selector dropdown list if it can be scrolled down. !3384 +- Document how to set up GitLab Geo for HA. !3468 +- Add border for epic edit button. + + +## 10.2.8 (2018-02-07) + +### Security (1 change) + +- Restrict LDAP API to admins only. + + +## 10.2.7 (2018-01-18) + +- No changes. + +## 10.2.6 (2018-01-11) + +### Security (2 changes) + +- Fix LDAP external user/group bug on first sign in. +- Deny persisting milestones from outside project/group scope on boards. + + +## 10.2.5 (2017-12-15) + +### Fixed (1 change) + +- Fix board filter for predefined milestones. + + +## 10.2.4 (2017-12-07) + +- No changes. + +## 10.2.3 (2017-11-30) + +### Fixed (5 changes) + +- Fix viewing default push rules on a Geo secondary. !3559 +- Disable autocomplete for epics. +- Fix epic fullscreen editing. +- Fix tasklist for epics. +- Fix Geo wiki sync error not increasing retry count. + + +## 10.2.2 (2017-11-23) + +### Fixed (6 changes) + +- Fix in-progress repository syncs counting as failed. !3424 +- Don't user issuable_sort cookie for epics collection. +- Enable scoped boards for Early Adopters. +- Account shared runner minutes to top-level namespace. +- Geo - Ensure that LFS object deletions are communicated to the secondary. +- Disable file attachments for epics. + +### Other (1 change) + +- Document a failure mode for large repositories in Geo. !3500 + + +## 10.2.1 (2017-11-22) + +- No changes. + +## 10.2.0 (2017-11-22) + +### Fixed (17 changes) + +- Geo - Does not move projects backed by hashed storage when handling renamed events. !3066 +- Geo: Don't sync disabled project wikis. !3109 +- Reconfigure the Geo tracking database pool size when running as Sidekiq. !3181 +- Geo - Ensures that leases were returned. !3241 +- Fix (un)approver names not being shown in plaintext emails. !3266 +- Add post-migration to drain all Geo related redis queues. !3289 +- Prevent the Geo log cursor from running on primary nodes. !3411 +- Reduce the number of Elasticsearch client instances that are created. !3432 +- Fix generated clone URLs for wikis on Geo secondaries. !3448 +- Remove duplicate delete button in epic. +- Fix: Failed to rebase MR from forked repo. +- Fix: Geo API bug. Statistic is not collected when prometheus is disabled. +- Geo - Ensure that repository deletions in a primary node are correctly deleted in a secondary node. +- Geo: Fix handling of nil values on advanced section in admin screen. +- Redirect to existing group boards using old URL if there is no subgroup called 'boards'. +- Geo - Allow Sidekiq to retry failed jobs to rename project repositories. +- Geo: Ensure database is connected before attempting to check for secondary status. + +### Changed (4 changes) + +- Add project actions in Audit events. !3160 +- Add group actions in Audit events. !3176 +- Geo: Don't retry repositories or files until everything has been backfilled. !3182 +- Improve Codeclimate UI. + +### Performance (1 change) + +- Reduce the quiet times between scheduler runs on Geo secondaries. !3185 + +### Added (20 changes, 1 of them is from the community) + +- Add new push rule to enforce that only the author of a commit can push to the repository. !3086 +- Make the maximum capacity of Geo backfill operations configurable. !3107 +- Mirrors can now hard fail, keeping them from being retried until a project admin takes action. !3117 +- View/edit epic at group level. !3126 +- Add worker to prune the Geo Event Log. !3172 +- julian7 Add required_groups option to SAML config, to restrict access to GitLab to specific SAML groups. !3223 (Balazs Nagy) +- Geo: Expire and resync attachments from renamed projects in secondary nodes when using legacy storage. !3259 +- On Secondary read-only Geo Nodes now a flash banner is shown on all pages. !3260 +- Make GeoLogCursor Highly Available. !3305 +- Allow Geo repository sync over HTTPS. !3341 +- Allow persisting board configuration in order to automatically filter issues. +- Improve error handling. +- Add epics list and add epics to nav sidebar. +- Introduce EEU lincese with epics as the first feature. +- Add ability to create new epics. +- Add sidebar for epic. +- Add delete epic button. +- Allow admins to globally disable all remote mirrors from application settings page. +- Add support for logging Prometheus metrics for Geo. +- Use PostgreSQL FDW for Geo downloads. + +### Other (2 changes, 1 of them is from the community) + +- Suppress MergeableSelector warning candidates in EE-only files. !3225 (Takuya Noguchi) +- Enhance the documentation for gitlab-ctl replicate-geo-database. !3268 + + +## 10.1.7 (2018-01-18) + +- No changes. + +## 10.1.6 (2018-01-11) + +### Security (2 changes) + +- Fix LDAP external user/group bug on first sign in. +- Deny persisting milestones from outside project/group scope on boards. + + +## 10.1.5 (2017-12-07) + +- No changes. + +## 10.1.4 (2017-11-14) + +- No changes. + +## 10.1.3 (2017-11-10) + +- [FIXED] Fix: Failed to rebase MR from forked repo. + +## 10.1.2 (2017-11-08) + +- [SECURITY] Fix vulnerability that could allow any user of a Geo instance to clone any repository on the secondary instance. +- [SECURITY] Geo JSON web tokens now expire after two minutes to reduce risk of compromise. + +## 10.1.1 (2017-10-31) + +- [FIXED] Fix LDAP group sync for nested groups e.g. when base has uppercase or extraneous spaces. !3217 +- [FIXED] Geo: read-only safeguards was not working on Secondary node. !3227 +- [FIXED] fix height of rebase and approve buttons. +- [FIXED] Move group boards routes under - and remove "boards" from reserved paths. + +## 10.1.0 (2017-10-22) + +- [SECURITY] Prevent Related Issues from leaking confidential issues. !541 +- [FIXED] Geo - Selective replication allows admins to select any groups. !2779 +- [FIXED] Fix CSV export when filtering issues by multiple labels. !2852 +- [FIXED] Impersonation no longer gets stuck on password change. !2904 +- [FIXED] Mirroring to remote repository no longer fails after a force push. !2919 +- [FIXED] Fix a merge request validation error on forked projects. !2932 +- [FIXED] Fix an error reporting some failures in the elasticsearch indexer. !2998 +- [FIXED] Fix a Geo node validation, preventing admins from locking themselves out. !3040 +- [FIXED] Find stuck scheduled import jobs and also mark them as failed. !3055 +- [FIXED] Fix removing the username from the git repository URL for pull mirroring. !3060 +- [FIXED] Prevent failed file syncs from stalling Geo backfill. !3101 +- [FIXED] Fix reading the status of a secondary Geo node from the primary. !3140 +- [FIXED] Always allow the default branch as a branch name. !3154 +- [FIXED] Show errors when rebase onto target branch fails in the UI. +- [FIXED] Fix base link for issues on group boards. +- [FIXED] Don't create todos for old issue assignees. +- [FIXED] Geo: Fix attachments/avatars saving to the wrong directory. +- [FIXED] Save Geo files to a temporary file and rename after success. +- [FIXED] Fix personal snippets not downloading in Geo secondaries. +- [FIXED] Geo: Limit the huge cross-database pluck for LFS objects and attachments. +- [CHANGED] Schedule repository synchronization when processing events on a Geo secondary node. !2838 +- [CHANGED] Create idea of read-only database and add method to check for it. !2954 +- [CHANGED] Remove the backoff delay from Geo repository sync. !3009 +- [CHANGED] Improves visibility of deploy boards. +- [CHANGED] Improve performance of rebasing by using worktree. +- [ADDED] Add suport for CI/CD pipeline policy management. !2986 +- [ADDED] Add LDAP synchronization based on filter for GitLab groups. +- [OTHER] Add Geo rake task descriptions. !2925 +- [OTHER] Improve logging output for several Geo background workers. !2961 +- [OTHER] Add partial index on push_rules.is_sample. +- Add new push rule to reject unsigned commits. !2913 + +## 10.0.7 (2017-12-07) + +- No changes. + +## 10.0.5 (2017-11-03) + +- [FIXED] Find stuck scheduled import jobs and also mark them as failed. !3055 +- [FIXED] Fix removing the username from the git repository URL for pull mirroring. !3060 +- [FIXED] Fix base link for issues on group boards. +- [FIXED] Move group boards routes under - and remove "boards" from reserved paths. +- [FIXED] Geo: Fix attachments/avatars saving to the wrong directory. + +## 10.0.4 (2017-10-16) + +- [SECURITY] Prevent Related Issues from leaking confidential issues. !541 +- [SECURITY] Escape user name in filtered search bar. + +## 10.0.3 (2017-10-05) + +- [FIXED] Rewrite Geo database rake tasks so they operate on the correct database. !3052 +- [FIXED] Show group tab if member lock is enabled. +- [FIXED] File uploaders do not perform hard check, only soft check. +- [FIXED] Only show Turn on Service Desk button when user has permissions. +- [FIXED] Fix EE delta size check handling with annotated tags. + +## 10.0.2 (2017-09-27) + +- [FIXED] Send valid project path as name for Jira dev panel. +- [FIXED] Fix delta size check to handle commit or nil objects. + +## 10.0.1 (2017-09-23) + +- No changes. + +## 10.0.0 (2017-09-22) + +- [SECURITY] Check if LDAP users are in external groups on login. !2720 +- [FIXED] Fix typo for `required` attribute. !2659 +- [FIXED] Fix global code search when using negation queries. !2709 +- [FIXED] Fixes activation of project mirror when new project is created. !2756 +- [FIXED] Geo - Whitelist LFS requests to download objects on a secondary node. !2758 +- [FIXED] Fix Geo::RepositorySyncWorker so attempts to sync all projects if some are failing. !2796 +- [FIXED] Fix unsetting credentials data for pull mirrors. !2810 +- [FIXED] Geo: Gracefully catch incorrect db key on primary. !2819 +- [FIXED] Fix a regression breaking projects with an empty import URL. !2824 +- [FIXED] Fix a 500 error in the SSH host keys lookup action. !2827 +- [FIXED] Handle Geo DB replication lag as 24h/day & 7d/week. !2833 +- [FIXED] Geo - Add a unique index on project_id to the Geo project_registry table. !2850 +- [FIXED] Improve Geo repository sync performance for larger databases. !2887 +- [FIXED] Ensure #route_setting is available before calling it. !2908 +- [FIXED] Fix searching by assignee in the service desk. !2969 +- [FIXED] Fix approvals before merge error while importing projects. +- [FIXED] Fix the gap in approvals in merge request widget. +- [FIXED] Fix branch name regex not saving in /admin/push_rule config. +- [FIXED] Fix merges not working when project is not licensed for squash. +- [CHANGED] Add Time estimate and Time spend fields in csv export. !2627 (g3dinua, LockiStrike) +- [CHANGED] Improve copy so users will set up SSH from DB for Geo. !2644 +- [CHANGED] Support `codequality` job name for Code Quality feature. !2704 +- [CHANGED] Support Elasticsearch v5.1 - v5.5. !2751 +- [CHANGED] Geo primary nodes no longer require SSH keys. !2861 +- [CHANGED] Show Geo event log and cursor data in node status page. +- [CHANGED] Use a logger for the artifacts migration rake task. +- [ADDED] LFS files can be stored in remote object storage such as S3. !2760 +- [ADDED] Add LDAP sync endpoint to Groups API. !2785 +- [ADDED] Geo - Log a repository created event when a project is created. !2807 +- [ADDED] Show geo.log in the Admin area. !2845 +- [ADDED] Commits integration with Jira development panel. +- [OTHER] Add missing indexes to geo_event_log table. !2836 +- [OTHER] Geo - Ignore S3-backed LFS objects on secondary nodes. !2889 +- Fix a bug searching private projects with Elasticsearch as an admin or auditor. !2613 +- Don't put the password in the SSH remote if using public-key authentication. !2837 +- Support handling of rename events in Geo Log Cursor. +- Update delete board button text color to red and fix hover color. +- Search for issues with multiple assignees. +- Fix: When MR approvals are disabled, but approvers were previously assigned, all approvers receive a notification on every MR. +- Add group issue boards. +- Ports style changes fixed in a conflict in ce to ee upstream to master for new projects page. + +## 9.5.10 (2017-11-08) + +- [SECURITY] Ensure GitLab Geo JSON web tokens expire after 2 minutes. + +## 9.5.9 (2017-10-16) + +- [SECURITY] Prevent Related Issues from leaking confidential issues. +- Escape user name in filtered search bar. + +## 9.5.8 (2017-10-04) + +- [FIXED] Fix EE delta size check handling with annotated tags. +- [FIXED] Fix delta size check to handle commit or nil objects. + +## 9.5.7 (2017-10-03) + +- No changes. + +## 9.5.6 (2017-09-29) + +- [FIXED] Show group tab if member lock is enabled. + +## 9.5.5 (2017-09-18) + +- [FIXED] Fixes activation of project mirror when new project is created. !2756 +- [FIXED] Geo - Whitelist LFS requests to download objects on a secondary node. !2758 +- [FIXED] Fix unsetting credentials data for pull mirrors. !2810 +- [FIXED] Fix a regression breaking projects with an empty import URL. !2824 +- [FIXED] Fix a 500 error in the SSH host keys lookup action. !2827 +- [FIXED] Ensure #route_setting is available before calling it. !2908 +- [FIXED] Fix branch name regex not saving in /admin/push_rule config. +- [FIXED] Fix the gap in approvals in merge request widget. +- [FIXED] Fix merges not working when project is not licensed for squash. +- Don't put the password in the SSH remote if using public-key authentication. !2837 + +## 9.5.4 (2017-09-06) + +- [FIXED] Validate branch name push rule when pushing branch without commits. !2685 + +## 9.5.3 (2017-09-03) + +- [FIXED] Check if table exists before loading the current license. !2783 +- [FIXED] Extend early adopters feature set. + +## 9.5.2 (2017-08-28) + +- [FIXED] Fix LDAP backwards-compatibility when using "method" or when "verify_certificates" is not defined. !2690 +- [FIXED] Geo - Count projects where wiki sync failed in node status page. + +## 9.5.1 (2017-08-23) + +- [FIXED] Fix url for object store artifacts. +- [CHANGED] Ensure all database queries are routed through the database load balancer when load balancing is enabled +. !2707 + +## 9.5.0 (2017-08-22) + +- [FIXED] Fix Copy to Clipboard for SSH Public Key on Pull Repository settings. !2692 +- [FIXED] Enable mirror repository button. +- [FIXED] Create system notes only if issue was successfully related. +- [FIXED] Fix issue boards focus button not being visible to guest users. +- Namespace license checks Audit Events & Admin Audit Log. !2326 +- Namespace license checks for Repository Mirrors. !2328 +- Automatically link kerberos users to LDAP people. !2405 +- Implement SSH public-key support for repository mirroring. !2423 +- Shows project names for commits in elasticsearch global search. !2434 +- Add admin application setting to allow group owners to manage LDAP. !2529 +- Geo - Selectively choose which namespaces to replicate in DR. !2533 +- Support variables on Trigger API for Cross-project pipeline. !2557 +- Allow excluding sidekiq queues from execution in sidekiq-cluster. !2571 +- Ensure artifacts are moved locally within the filesystem to prevent timeouts. !2572 +- Audit failed login events. !2587 +- Spread load across all nodes in an elasticsearch cluster. !2625 +- Improves handling of stuck imports. !2628 +- Improves handling of the mirror threshold. !2671 +- Allow artifacts access with job_token parameter or CI_JOB_TOKEN header. +- Add initial Groups/Billing and Profile/Billing routing and template. +- Fix rebase from fork when upstream has protected branches. +- Present Related Issues add badge only when user can manage related issues (previously when user could edit issue). +- clean up merge request widget UI. +- Make contextual sidebar collapsible. +- Fix accessing individual files on Object Storage. +- Fix rebase button when merge request is created from a fork. +- Skip oAuth authorization for trusted applications. + +## 9.4.7 (2017-10-16) + +- [SECURITY] Prevent Related Issues from leaking confidential issues. +- Fix when pushing without a branch name. !2879 +- Escape user name in filtered search bar. + +## 9.4.6 (2017-09-06) + +- [FIXED] Validate branch name push rule when pushing branch without commits. !2685 + +## 9.4.5 (2017-08-14) + +- Ensure artifacts are moved locally within the filesystem to prevent timeouts. !2572 +- Fix rebase from fork when upstream has protected branches. +- Present Related Issues add badge only when user can manage related issues (previously when user could edit issue). +- Fix accessing individual files on Object Storage. + +## 9.4.4 (2017-08-09) + +- No changes. + +## 9.4.3 (2017-07-31) + +- Present Related Issues widget for logged-out users when available. + +## 9.4.2 (2017-07-28) + +- Adds lower bound to pull mirror scheduling feature. !2366 +- Add warning and option toggle when rebuilding authorized_keys. !2508 +- Fix CSS for mini graph with downstream pipeline. +- Renamed board to boards in new project sidebar. +- Fix Rebasing not working with Merge Requests. +- Fixed issue boards focus mode when new navigation is turned on. + +## 9.4.1 (2017-07-25) + +- Cleans up mirror capacity in project destroy service if project is a scheduled mirror. !2445 +- Fixes unscoping of imposed capacity limit by find_each method on Mirror scheduler. !2460 +- Remove text underline from suggested approvers. + +## 9.4.0 (2017-07-22) + +- GeoLogCursor is part of a new experimental Geo replication system. !1988 +- Add explicit licensing for Elasticsearch. !2108 +- Add namespace license checks for Service Desk (EEP). !2109 +- Add environment scope to secret variables to specify environments. !2112 +- Namespace license checks for exporting issues (EES). !2164 +- Retry Elasticsearch queries on failure. !2181 +- Introduce namespace license checks for rebase before merge. !2200 +- Geo: fix removal of repositories from disk on secondary nodes. !2210 +- Add license checks for brundown charts. !2219 +- Add namespace license checks for squash before merge. !2249 +- Namespace license checks for fast-forward merge (EES). !2272 +- Empty repository mirror no longer creates master branch with README automatically. !2276 +- Introduce namespace licensing for issue weights (EES). !2291 +- Add namespace license checks for Contribution Analytics. !2302 +- Add license checks for focus mode on the issue board. !2303 +- Add license checks for issue boards with milestones. !2315 +- Add license checks for multiple issue boards. !2317 +- Geo: Fix clone instructions in a secondary node for SSH protocol. !2319 +- Namespace license checks Issue & MR template. !2321 +- Introduce namespace license checks for merge request approvers (EES). !2324 +- Introduce namespace license checks for Push Rules (EES). !2335 +- Geo: Implement alternative to geo_{primary|secondary}_role in gitlab.yml. !2352 +- Geo: Added extra SystemCheck checks. !2354 +- Implement progressive elasticsearch indexing for project mirrors. !2393 +- Fix undefined method quote when database load balancing is used. !2430 +- Improve the performance of the project list API. !12679 +- fix approver placeholder icon in ie11. +- Add public API for listing, creating and deleting Related Issues. +- All artifacts are now browsable. +- Escape symbols in exported CSV columns to prevent command execution in Microsoft Excel. +- Geo - Fix RepositorySyncService when cannot obtain a lease to sync a repository. +- Prevent mirror user to be assigned to users other than the current one. +- Geo - Makes the projects synchronization faster on secondaries nodes. +- Only show the LDAP sync banner on first login. +- Enable service desk be default. +- Fix creation of push rules via POST API. +- Fix Geo middleware to work properly with multiple requests. +- [GitLab.com only] Add Slack applicationq service. +- Speed up checking for approvers when approvers are specified on the MR. +- Allows manually adding bi-directional relationships between issues in the issue page (EES feature). +- Add Geo repository renamed event log. +- Merge states to allow realtime with deploy boards. +- Fix 500 error when approvals are enabled and editing an MR conflicts with another edit. +- add toggle for overriding approvers per MR. +- Add optional sha param when approving a merge request through the API. +- Allow updating shared_runners_minutes_limit on admin Namespace API. +- Allow to Store Artifacts on Object Storage. +- Adding support for AWS ec2 instance profile credentials with elasticsearch. (Matt Gresko) +- Fixed edit issue boards milestone action buttons not sticking to bottom of dropdown. +- Respect the external user setting in Elasticsearch. + +## 9.3.11 (2017-09-06) + +- [FIXED] Validate branch name push rule when pushing branch without commits. !2685 +- Prevent mirror user to be assigned to users other than the current one. + +## 9.3.10 (2017-08-09) + +- No changes. + +## 9.3.9 (2017-07-20) + +- No changes. + +## 9.3.8 (2017-07-19) + +- Escape symbols in exported CSV columns to prevent command execution in Microsoft Excel. +- Prevent mirror user to be assigned to users other than the current one. + +## 9.3.7 (2017-07-18) + +- No changes. + +## 9.3.6 (2017-07-12) + +- Geo: Fix clone instructions in a secondary node for SSH protocol. !2319 +- Implement progressive elasticsearch indexing for project mirrors. !2393 + +## 9.3.5 (2017-07-05) + +- Make admin mirror application setting GitLab.com exclusive. !2307 +- Make Geo::RepositorySyncService force create a repo. + +## 9.3.4 (2017-07-03) + +- Update gitlab-shell to 5.1.1 to fix Post Recieve errors + +## 9.3.3 (2017-06-30) + +- Add metrics to both remote and non remote mirroring. !2118 +- Forces import worker with mirror to insert mirror in front of queue. !2231 +- Fix locked and stale SSH keys file from 9.3.0 upgrade. !2240 +- Fix crash in LDAP sync when user was removed. !2289 +- allow rebase for unapproved merge requests. +- Geo - Fix path_with_namespace for instances of Geo::DeletedProject. + +## 9.3.2 (2017-06-27) + +- Fix GitLab check: Problem with Elastic Search. !2278 + +## 9.3.1 (2017-06-26) + +- Geo: fix removal of repositories from disk on secondary nodes. !2210 +- Fix Geo middleware to work properly with multiple requests. + +## 9.3.0 (2017-06-22) + +- Per user/group access levels for Protected Tags. !1629 +- Add a user's memberships when logging in through LDAP. !1819 +- Add server-wide Audit Log admin screen. !1852 +- Move pull mirroring to adaptive scheduling. !1853 +- Create a push rule to check the branch name. !1896 (Riccardo Padovani) +- Add shared_runners_minutes_limit to groups and users API. !1942 +- Compare codeclimate artifacts on the merge request page. !1984 +- Lookup users by email in LDAP if lookup by DN fails during sync. !2003 +- Update mirror_user for project when mirror_user is deleted. !2013 (Athar Hameed) +- Geo: persist clone url prefix in the database. !2015 +- Geo: prevent Gitlab::Git::Repository::NoRepository from stucking replication. !2115 +- Geo: fixed Dynamic Backoff strategy that was not being used by workers. !2128 +- [Elasticsearch] Improve code search for camel case. +- Fixed header being over issue boards when in focus mode. +- Fix: Approvals not reset if changing target branch. +- Fix bug where files over 2 GB would not be saved in Geo tracking DB. +- Add primary node clone URL to Geo secondary 'How to work faster with Geo' popover. +- Fix broken time sync leeway with Geo. +- Gracefully handle case when Geo secondary does not have the right db_key_base. +- Use the current node configuration to populate suggested new URL for Geo node. +- Check if a merge request is approved when merging from API or slash command. +- Add closed_at field to issue CSV export. +- Geo - Properly set tracking database connection and cron jobs on secondary nodes. +- Add push events to Geo event log. +- fix Rebase being disabled for unapproved MRs. +- Fix approvers dropdown when creating a merge request from a fork. +- Add relation between Pipelines. +- Allow to Trigger Pipeline using CI Job Token. +- Allow to view Personal pipelines quota. +- Geo - Use GeoNode#clone_url_prefix for the Geo::RepositorySyncService. +- Elasticsearch searches through the project description. +- Fix: /unassign by default unassigns everyone. Implement /reassign command. +- Speed up checking for approvers remaining. + +## 9.2.10 (2017-08-09) + +- No changes. + +## 9.2.9 (2017-07-20) + +- No changes. + +## 9.2.8 (2017-07-19) + +- Escape symbols in exported CSV columns to prevent command execution in Microsoft Excel. +- Prevent mirror user to be assigned to users other than the current one. + +## 9.2.7 (2017-06-21) + +- Geo: fixed Dynamic Backoff strategy that was not being used by workers. !2128 +- fix Rebase being disabled for unapproved MRs. + +## 9.2.6 (2017-06-16) + +- Geo: backported fix from 9.3 for big repository sync issues. !2000 +- Geo - Properly set tracking database connection and cron jobs on secondary nodes. +- Fix approvers dropdown when creating a merge request from a fork. +- Fixed header being over issue boards when in focus mode. +- Fix bug where files over 2 GB would not be saved in Geo tracking DB. + +## 9.2.5 (2017-06-07) + +- No changes. + +## 9.2.4 (2017-06-02) + +- No changes. +- No changes. + +## 9.2.3 (2017-05-31) + +- No changes. +- No changes. +- Respect the external user setting in Elasticsearch. + +## 9.2.2 (2017-05-25) + +- No changes. + +## 9.2.1 (2017-05-23) + +- No changes. + +## 9.2.0 (2017-05-22) + +- Stop using sidekiq cron for push mirrors. !1616 +- Inline RSS button with Export Issues button for mobile. !1637 +- Highlight Contribution Analytics tab under groups when active, remove sub-nav items. !1677 +- Uses etag polling for deployboards. !1713 +- Support more elasticsearch versions. !1716 +- Support advanced search queries using elasticsearch. !1770 +- Remove superfluous wording on push rules. !1811 +- Geo - Fix signing out from secondary node when "Remember me" option is checked. !1903 +- Add global wiki search using Elasticsearch. +- Remove warning about protecting Service Desk email from form. +- Geo: Resync repositories that have been updated recently. +- Respect project features when searching alternative branches with elasticsearch enabled. +- Backfill projects where the last attempt to backfill failed. +- Fix MR approvals sentence when all approvers need to approve the MR. +- Fix for XSS in project mirror errors caused by Hamlit filter usage. +- Feature availability check using feature list AND license addons. +- Disable mirror workers for Geo secondaries. + +## 9.1.10 (2017-08-09) + +- No changes. + +## 9.1.9 (2017-07-20) + +- No changes. + +## 9.1.8 (2017-07-19) + +- Escape symbols in exported CSV columns to prevent command execution in Microsoft Excel. +- Prevent mirror user to be assigned to users other than the current one. + +## 9.1.7 (2017-06-07) + +- No changes. + +## 9.1.6 (2017-06-02) + +- No changes. + +## 9.1.5 (2017-05-31) + +- Respect the external user setting in Elasticsearch. + +## 9.1.4 (2017-05-12) + +- Remove warning about protecting Service Desk email from form. +- Backfill projects where the last attempt to backfill failed. + +## 9.1.3 (2017-05-05) + +- No changes. +- No changes. +- No changes. +- Respect project features when searching alternative branches with elasticsearch enabled. +- Fix for XSS in project mirror errors caused by Hamlit filter usage. + +## 9.1.2 (2017-05-01) + +- No changes. +- No changes. +- No changes. +- Fix commit search on some elasticsearch indexes. !1745 +- Fix emailing issues to projects when Service Desk is enabled. +- Fix bug where Geo secondary Sidekiq cron jobs would not be activated if settings changed. + +## 9.1.1 (2017-04-26) + +- No changes. + +## 9.1.0 (2017-04-22) + +- Fix rake gitlab:env:info elasticsearch datum. !1422 +- Fix 500 errors caused by elasticsearch results referencing garbage-collected commits. !1430 +- Adds timeout option to push mirrors. !1439 +- elasticsearch: Add support for an experimental repository indexer. !1483 +- Update color palette to a more harmonious and consistent one. !1500 +- Cache Gitlab::Geo queries. !1507 +- Add Service Desk feature. !1508 +- Fix pre-receive hooks when using Git 2.11 or later. !1525 +- Geo: Add support to sync avatars and attachments. !1562 +- Fix Elasticsearch not working when URL ends with a forward slash. !1566 +- Allow admins to perform global searches with Elasticsearch. !1578 +- Periodically persists users activity to users.last_activity_on. !1597 +- Removes duplicate count of LFS objects from repository_and_lfs_size method. !1599 +- Fix searching notes and snippets as an auditor. !1674 +- Fix searching for notes with elasticsearch when a user is a member of many projects. !1675 +- Fix type declarations for spend/estimate values. +- Speed up suggested approvers on MR creation. +- Fix squashing MRs when the repository contains a ref named HEAD. +- Fix approver count reset when editing assignee or labels. +- Geo: handle git failures on GeoRepositoryFetchWorker. +- Give each elasticsearch worker its own sidekiq queue. +- Fixes broken link to pipeline quota. +- Prevent filtering issues by multiple Milestones or Authors. +- Fix 500 error when selecting a mirror user. +- Add index to approvals.merge_request_id. +- Added mock data for Deployboard. +- Add uuid to usage ping. +- Expose board project and milestone on boards API. +- Fix active user count to ignore internal users. +- Add warning when burndown data is not accurate. +- Check if incoming emails and email key are available for service desk. +- Add burndown chart to milestones. +- Make deployboard to be visible by default. +- Add a Rake task to make the current node the primary Geo node. +- Return 404 instead of a 500 error on API status endpoint if Geo tracking DB is not enabled. +- Remove N+1 queries for Groups::AnalyticsController. +- Show user cohorts data when usage ping is enabled. +- Visualise Canary Deployments. + +## 9.0.13 (2017-08-09) + +- No changes. + +## 9.0.12 (2017-07-20) + +- No changes. + +## 9.0.11 (2017-07-19) + +- Escape symbols in exported CSV columns to prevent command execution in Microsoft Excel. +- Prevent mirror user to be assigned to users other than the current one. + +## 9.0.10 (2017-06-07) + +- No changes. + +## 9.0.9 (2017-06-02) + +- No changes. + +## 9.0.8 (2017-05-31) + +- Respect the external user setting in Elasticsearch. + +## 9.0.7 (2017-05-05) + +- Respect project features when searching alternative branches with elasticsearch enabled. +- Fix for XSS in project mirror errors caused by Hamlit filter usage. + +## 9.0.6 (2017-04-21) + +- Cache Gitlab::Geo queries. !1507 +- Fix searching for notes with elasticsearch when a user is a member of many projects. !1675 +- Fix 500 error when selecting a mirror user. +- Fix active user count to ignore internal users. + +## 9.0.5 (2017-04-10) + +- Return 404 instead of a 500 error on API status endpoint if Geo tracking DB is not enabled. + +## 9.0.4 (2017-04-05) + +- No changes. + +## 9.0.3 (2017-04-05) + +- Allow to edit pipelines quota for user. +- Fixed label resetting when sorting by weight. (James Clark) +- Fixed issue boards milestone toggle text not updating when filtering. +- Fixed mirror user dropdown not displaying. + +## 9.0.2 (2017-03-29) + +- No changes. + +## 9.0.1 (2017-03-28) + +- No changes. + +## 9.0.0 (2017-03-22) + +- Geo: Replicate repository creation in Geo secondary node. !952 +- Make approval system notes lowercase. !1125 +- Issues can be exported as CSV, via email. !1126 +- Try to update mirrors again after 15 minutes if the previous update failed. !1183 +- Adds abitlity to render deploy boards in the frontend side. !1233 +- Add filtered search to MR page. !1243 +- Update project list API returns with approvals_before_merge attribute. !1245 (Geoff Webster) +- Catch Net::LDAP::DN exceptions in EE::Gitlab::Auth::LDAP::Group. !1260 +- API: Use `post ":id/#{type}/:subscribable_id/subscribe"` to subscribe and `post ":id/#{type}/:subscribable_id/unsubscribe"` to unsubscribe from a resource. !1274 (Robert Schilling) +- API: Remove deprecated fields Notes#upvotes and Notes#downvotes. !1275 (Robert Schilling) +- Deploy board backend. !1278 +- API: Remove the ProjectGitHook API. !1301 (Robert Schilling) +- Expose elasticsearch client params for AWS signing and HTTPS. !1305 (Matt Gresko) +- Fix LDAP DN case-mismatch bug in LDAP group sync. !1337 +- Remove es6 file extension from JavaScript files. !1344 (winniehell) +- Geo: Don't load dependent models when fetching an existing GeoNode from the database. !1348 +- Parallelise the gitlab:elastic:index_database Rake task. !1361 +- Robustify reading attributes for elasticsearch. !1365 +- Introduce one additional thread into bin/elastic_repo_indexer. !1372 +- Show hook errors for fast-forward merges. !1375 +- Allow all parameters of group webhooks to be set through the UI. !1376 +- Fix Elasticsearch queries when a group_id is specified. !1423 +- Check the right index mapping based on Rails environment for rake gitlab:elastic:add_feature_visiblity_levels_to_project. !1473 +- Fix issues with another milestone that has a matching list label could not be added to a board. +- Only admins or group owners can set LDAP overrides. +- Add support for load balancing database queries. +- Only replace non-approval mr-widget-footer on getMergeStatus. +- Remove repository_storage from V4 "/application/settings" settings API. +- Added headers to protected branches access dropdowns. +- Remove support for Git Annex. +- Repositioned multiple issue boards selector. +- Added back weight in issue rows on issue list. +- Add basic support for GitLab Geo file transfers over HTTP. +- Added weight slash command. +- Set deployment status invalid when the environments does not match a k8s label. +- Combined deploy keys, push rules, protect branches and mirror repository settings options into a single one called Repository. +- Rebase - fix commiter email & name. +- Adds a EE specific dev favicon. +- Elastic security fix: Respect feature visibility level. +- Update Elasticsearch to 5.1. +- [Elasticsearch] More efficient search. +- Get Geo secondaries nodes statuses over AJAX. + +## 8.17.8 (2017-08-09) + +- No changes. + +## 8.17.7 (2017-07-19) + +- Prevent mirror user to be assigned to users other than the current one. + +## 8.17.6 (2017-05-05) + +- Respect project features when searching alternative branches with elasticsearch enabled. + +## 8.17.5 (2017-04-05) + +- No changes. + +## 8.17.4 (2017-03-19) + +- Elastic security fix: Respect feature visibility level. + +## 8.17.3 (2017-03-07) + +- No changes. + +## 8.17.2 (2017-03-01) + +- No changes. + +## 8.17.1 (2017-02-28) + +- Fix admin email notification recipient group select list. +- Add repository_storage field back to projects API for admin users. +- Don't try to update a project's external service caches on a secondary Geo node. +- Fixed merge request state not updating when approvals feature is active. +- Improve error messages when squashing fails. + +## 8.17.0 (2017-02-22) + +- Read-only "auditor" user role. !998 +- Also reset approvals on push when merge request is closed. !1051 +- Copy commit SHA to clipboard. !1066 +- Pull EE specific Gitlab::Auth code in to its own module. !1112 +- Geo: Added `gitlab:geo:check` and improved `gitlab:envinfo` rake tasks. !1120 +- Geo: send the new event type with the backfill function. !1157 +- Re-add removed params from projects and issues V3 API. !1209 +- Add configurable minimum mirror sync time in admin section. !1217 +- Move RepositoryUpdateRemoteMirrorWorker jobs to project_mirror Sidekiq queue. !1234 +- Change Builds word to Pipelines in Mirror settings page. +- Fix bundle tag in anaytics page. +- Support v4 API for GitLab Geo endpoints. +- Fixed merge request environment link not displaying. +- Reduce queries needed to check if node is a primary or secondary Geo node. +- Allow squashing merge requests into a single commit. + +## 8.16.9 (2017-04-05) + +- No changes. + +## 8.16.8 (2017-03-19) + +- No changes. +- No changes. +- No changes. +- Elastic security fix: Respect feature visibility level. + +## 8.16.7 (2017-02-27) + +- Fixed merge request state not updating when approvals feature is active. + +## 8.16.6 (2017-02-17) + +- Geo: send the new event type with the backfill function. !1157 +- Move RepositoryUpdateRemoteMirrorWorker jobs to project_mirror Sidekiq queue. !1234 +- Fixed merge request environment link not displaying. +- Reduce queries needed to check if node is a primary or secondary Geo node. +- Read true-up info from license and validate it. !1159 + +## 8.16.5 (2017-02-14) + +- No changes. + +## 8.16.4 (2017-02-02) + +- Disable all merge acceptance buttons pending MR approval. + +## 8.16.3 (2017-01-27) + +- Fix sidekiq cluster mishandling of queue names. !1117 + +## 8.16.2 (2017-01-25) + +- Track Mattermost usage in usage ping. !1071 +- Fix count of required approvals displayed on MR edit form. !1082 +- Fix updating approvals count when editing an MR. !1106 +- Don't try to show assignee in approved_merge_request_email if there's no assignee. + +## 8.16.1 (2017-01-23) + +- No changes. + +## 8.16.0 (2017-01-22) + +- Allow to limit shared runners minutes quota for group. !965 +- About GitLab link in sidebar that links to help page. !1008 +- Prevent 500 error when uploading/entering a blank license. !1016 +- Add more push rules to the API. !1022 (Robert Schilling) +- Expose issue weight in the API. !1023 (Robert Schilling) +- Copy <some text> to clipboard. !1048 + +## 8.15.8 (2017-03-19) + +- No changes. +- No changes. +- Elastic security fix: Respect feature visibility level. + +## 8.15.7 (2017-02-15) + +- No changes. + +## 8.15.6 (2017-02-14) + +- No changes. + +## 8.15.5 (2017-01-20) + +- No changes. + +## 8.15.4 (2017-01-09) + +- No changes. + +## 8.15.3 (2017-01-06) + +- Disable LDAP permission override in project members edit list. +- Perform only one fetch per push on Geo secondary nodes. + +## 8.15.2 (2016-12-27) + +- No changes. +- Fix ES search for non-default branches. + +## 8.15.1 (2016-12-23) + +- Fix 404/500 error while navigating to the 'show/destroy' pages. !993 + +## 8.15.0 (2016-12-22) + +- Adds a check ensure only active, ie. non-blocked users can be emailed from the admin panel. +- Add user activities API. +- Add milestone total weight to the milestone summary. +- Allow master/owner to change permission levels when LDAP group sync is enabled. !822 +- Geo: Improve project view UI to teach users how to clone from a secondary Geo node and push to a primary. !905 +- Technical debt follow-up from restricting pushes / merges by group. !927 +- Geo: Enables nodes to be removed even without proper license. !978 +- Update validates_hostname to 1.0.6 to fix a bug in parsing hexadecimal-looking domain names. !982 + +## 8.14.10 (2017-02-15) + +- No changes. + +## 8.14.9 (2017-02-14) + +- No changes. + +## 8.14.8 (2017-01-25) + +- No changes. + +## 8.14.7 (2017-01-21) + +- No changes. + +## 8.14.6 (2017-01-10) + +- No changes. + +## 8.14.5 (2016-12-14) + +- Add milestone total weight to the milestone summary. + +## 8.14.4 (2016-12-08) + +- No changes. + +## 8.14.3 (2016-12-02) + +- No changes. + +## 8.14.2 (2016-12-01) + +- No changes. + +## 8.14.1 (2016-11-28) + +- Fix: MergeRequestSerializer breaks on MergeRequest#rebase_dir_path when source_project doesn't exist anymore. + +## 8.14.0 (2016-11-22) + +- Added Backfill service for Geo. !861 +- Fix for autosuggested approvers(https://gitlab.com/gitlab-org/gitlab-ee/issues/1273). +- Gracefully recover from previously failed rebase. +- Disable retries for remote mirror update worker. !848 +- Fix Approvals API documentation. +- Add ability to set approvals_before_merge for project through the API. +- gitlab:check rake task checks ES version according to requirements +- Convert ASCII-8BIT LDAP DNs to UTF-8 to avoid unnecessary user deletions +- [Fix] Only owner can see "Projects" button in group edit menu + +## 8.13.12 (2017-01-21) + +- No changes. + +## 8.13.11 (2017-01-10) + +- No changes. + +## 8.13.10 (2016-12-14) + +- No changes. + +## 8.13.9 (2016-12-08) + +- No changes. + +## 8.13.8 (2016-12-02) + +- No changes. + +## 8.13.7 (2016-11-28) + +- No changes. + +## 8.13.6 (2016-11-17) + +- Disable retries for remote mirror update worker. !848 +- Fixed cache clearing on secondary Geo nodes. !869 +- Geo: fix a problem that prevented git cloning from secondary node. !873 + +## 8.13.5 (2016-11-08) + +- No changes + +## 8.13.4 (2016-11-07) + +- Weight dropdown in issue filter form does not stay selected. !826 + +## 8.13.3 (2016-11-02) + +- No changes + +## 8.13.2 (2016-10-31) + +- Don't pass a current user to Member#add_user in LDAP group sync. !830 + +## 8.13.1 (2016-10-25) + +- Hide multiple board actions if user doesnt have permissions. !816 +- Fix Elasticsearch::Transport::Transport::Errors::BadRequest when ES is enabled. !818 + +## 8.13.0 (2016-10-22) + +- Cache the last usage data to avoid unicorn timeouts +- Add user activity table and service to query for active users +- Fix 500 error updating mirror URLs for projects +- Restrict protected branch access to specific groups !645 +- Fix validations related to mirroring settings form. !773 +- Add multiple issue boards. !782 +- Fix Git access panel for Wikis when Kerberos authentication is enabled (Borja Aparicio) +- Decrease maximum time that GitLab waits for a mirror to finish !791 (Borja Aparicio) +- User groups (that can be assigned as approvers) +- Fix a search for non-default branches when ES is enabled +- Re-organized the Sidekiq queues for EE specific workers + +## 8.12.12 (2016-12-08) + +- No changes. + +## 8.12.11 (2016-12-02) + +- No changes. + +## 8.12.10 (2016-11-28) + +- No changes. + +## 8.12.9 (2016-11-07) + +- No changes + +## 8.12.8 (2016-11-02) + +- No changes + +## 8.12.7 + + - No EE-specific changes + +## 8.12.6 + + - No EE-specific changes + +## 8.12.5 + + - No EE-specific changes + +## 8.12.4 + + - [ES] Indexer works with smaller batches of repositories to not exceed NOFILE limit. !774 + +## 8.12.3 + + - Fix prevent_secrets checkbox on admin view + +## 8.12.2 + + - Fix bug when protecting a branch due to missing url paramenter in request !760 + - Ignore unknown project ID in RepositoryUpdateMirrorWorker + +## 8.12.1 + + - Prevent secrets to be pushed to the repository + - Prevent secrets to be pushed to the repository + +## 8.12.0 (2016-09-22) + + - Include more data in EE usage ping + - Reduce UPDATE queries when moving between import states on projects + - [ES] Instrument Elasticsearch::Git::Repository + - Request only the LDAP attributes we need + - Add 'Sync now' to group members page !704 + - Add repository size limits and enforce them !740 + - [ES] Instrument other Gitlab::Elastic classes + - [ES] Fix: Elasticsearch does not find partial matches in project names + - Faster Active Directory group membership resolution !719 + - [ES] Global code search + - [ES] Improve logging + - Fix projects with remote mirrors asynchronously destruction + +## 8.11.11 (2016-11-07) + +- No changes + +## 8.11.10 (2016-11-02) + +- No changes + +## 8.11.9 + + - No EE-specific changes + +## 8.11.8 + + - No EE-specific changes + +## 8.11.7 + + - Refactor Protected Branches dropdown. !687 + - Fix mirrored projects allowing empty import urls. !700 + +## 8.11.6 + + - Exclude blocked users from potential MR approvers. + +## 8.11.5 + + - API: Restore backward-compatibility for POST /projects/:id/members when membership is locked + +## 8.11.4 + + - No EE-specific changes + +## 8.11.3 + + - [ES] Add logging to indexer + - Fix missing EE-specific service parameters for Jenkins CI + - Set the correct `GL_PROTOCOL` when rebasing !691 + - [ES] Elasticsearch workers checks ES settings before running + +## 8.11.2 + + - Additional documentation on protected branches for EE + - Change slash commands docs location + +## 8.11.1 + + - Pulled due to packaging error. + +## 8.11.0 (2016-08-22) + + - Allow projects to be moved between repository storages + - Add rake task to remove old repository copies from repositories moved to another storage + - Performance improvement of push rules + - Temporary fix for #825 - LDAP sync converts access requests to members. !655 + - Optimize commit and diff changes access check to reduce git operations + - Allow syncing a group against all providers at once + - Change LdapGroupSyncWorker to use new LDAP group sync classes + - Allow LDAP `sync_ssh_keys` setting to be set to `true` + - Removed unused GitLab GEO database index + - Restrict protected branch access to specific users !581 + - Enable monitoring for ES classes + - [Elastic] Improve code search + - [Elastic] Significant improvement of global search performance + - [Fix] Push rules check existing commits in some cases + - [ES] Limit amount of retries for sidekiq jobs + - Fix Projects::UpdateMirrorService to allow tags pointing to blob objects + +## 8.10.12 + + - No EE-specific changes + +## 8.10.11 + + - No EE-specific changes + +## 8.10.10 + + - No EE-specific changes + +## 8.10.9 + + - Exclude blocked users from potential MR approvers. + +## 8.10.8 + + - No EE-specific changes + +## 8.10.7 + + - No EE-specific changes + +## 8.10.6 + + - Fix race condition with UpdateMirrorWorker Lease. !641 + +## 8.10.5 + + - Used cached value of project count in `Elastic::RepositoriesSearch` to reduce DB load. !637 + +## 8.10.4 + + - Fix available users in userselect dropdown when there is more than one userselect on the page. !604 (Rik de Groot) + - Fix updating skipped approvers in search list on removal. !604 (Rik de Groot) + +## 8.10.3 + + - Fix regression in Git Annex permission check. !599 + - [Elastic] Fix commit search for some URLs. !605 + - [Elastic][Fix] Commit search breaks for some URLs on gitlab-ce project + +## 8.10.2 + + - Fix pagination on search result page when ES search is enabled. !592 + - Decouple an ES index update from `RepositoryUpdateMirrorWorker`. !593 + - Fix broken `user_allowed?` check in Git Annex push. !597 + +## 8.10.1 + + - No EE-specific changes + +## 8.10.0 (2016-07-22) + + - Add EE license usage ping !557 + - Rename Git Hooks to Push Rules + - Fix EE keys fingerprint add index migration if came from CE + - Add todos for MR approvers !547 + - Replace LDAP group sync exclusive lease with state machine + - Prevent the author of an MR from being on the approvers list + - Isolate EE LDAP library code in EE module (Part 1) !511 + - Make Elasticsearch indexer run as an async task + - Fix of removing wiki data from index when project is deleted + - Ticket-based Kerberos authentication (SPNEGO) + - [Elastic] Suppress ActiveRecord::RecordNotFound error in ElasticIndexWorker + +## 8.9.10 + + - No EE-specific changes + +## 8.9.9 + + - No EE-specific changes + +## 8.9.8 + + - No EE-specific changes + +## 8.9.7 + + - No EE-specific changes + +## 8.9.6 + + - Avoid adding index for key fingerprint if it already exists. !539 + +## 8.9.5 + + - Fix of quoted text in lock tooltip. !518 + +## 8.9.4 + + - Improve how File Lock feature works with nested items. !497 + +## 8.9.3 + + - Fix encrypted data backwards compatibility after upgrading attr_encrypted gem. !502 + - Fix creating MRs on forks of deleted projects. !503 + - Roll back Grack::Auth to fix Git HTTP SPNEGO. !504 + +## 8.9.2 + + - [Elastic] Fix visibility of snippets when searching. + +## 8.9.1 + + - Improve Geo documentation. !431 + - Fix remote mirror stuck on started issue. !491 + - Fix MR creation from forks where target project has approvals enabled. !496 + - Fix MR edit where target project has approvals enabled. !496 + - Fix vertical alignment of git-hooks page. !499 + +## 8.9.0 (2016-06-22) + + - Fix JenkinsService test button + - Fix nil user handling in UpdateMirrorService + - Allow overriding the number of approvers for a merge request + - Allow LDAP to mark users as external based on their group membership. !432 + - Instrument instance methods of Gitlab::InsecureKeyFingerprint class + - Add API endpoint for Merge Request Approvals !449 + - Send notification email when merge request is approved + - Distribute RepositoryUpdateMirror jobs in time and add exclusive lease on them by project_id + - [Elastic] Move ES settings to application settings + - Always allow merging a merge request whenever fast-forward is possible. !454 + - Disable mirror flag for projects without import_url + - UpdateMirror service return an error status when no mirror + - Don't reset approvals when rebasing an MR from the UI + - Show flash notice when Git Hooks are updated successfully + - Remove explicit Gitlab::Metrics.action assignments, are already automatic. + - [Elastic] Project members with guest role can't access confidential issues + - Ability to lock file or folder in the repository + - Fix: Git hooks don't fire when committing from the UI + +## 8.8.9 + + - No EE-specific changes + +## 8.8.8 + + - No EE-specific changes + +## 8.8.7 + + - No EE-specific changes + +## 8.8.6 + + - [Elastic] Fix visibility of snippets when searching. + +## 8.8.5 + + - Make sure OAuth routes that we generate for Geo matches with the ones in Rails routes !444 + +## 8.8.4 + + - Remove license overusage message + +## 8.8.3 + + - Add standard web hook headers to Jenkins CI post. !374 + - Gracefully handle malformed DNs in LDAP group sync. !392 + - Reduce load on DB for license upgrade check. !421 + - Make it clear the license overusage message is visible only to admins. !423 + - Fix Git hook validations for fast-forward merges. !427 + - [Elastic] In search results, only show notes on confidential issues that the user has access to. + +## 8.8.2 + + - Fix repository mirror updates for new imports stuck in started + - [Elastic] Search through the filenames. !409 + - Fix repository mirror updates for new imports stuck in "started" state. !416 + +## 8.8.1 + + - No EE-specific changes + +## 8.8.0 (2016-05-22) + + - [Elastic] Database indexer prints its status + - [Elastic][Fix] Database indexer skips projects with invalid HEAD reference + - Fix skipping pages when restoring backups + - Add EE license via API !400 + - [Elastic] More efficient snippets search + - [Elastic] Add rake task for removing all indexes + - [Elastic] Add rake task for clearing indexing status + - [Elastic] Improve code search + - [Elastic] Fix encoding issues during indexing + - Warn admin if current active count exceeds license + - [Elastic] Search through the filenames + - Set KRB5 as default clone protocol when Kerberos is enabled and user is logged in (Borja Aparicio) + - Add support for Admin Groups to SAML + - Reduce emails-on-push HTML size by using a simple monospace font + - API requests to /internal/authorized_keys are now tagged properly + - Geo: Single Sign Out support !380 + +## 8.7.9 + + - No EE-specific changes + +## 8.7.8 + + - [Elastic] Fix visibility of snippets when searching. + +## 8.7.7 + + - No EE-specific changes + +## 8.7.6 + + - Bump GitLab Pages to 0.2.4 to fix Content-Type for predefined 404 + +## 8.7.5 + + - No EE-specific changes + +## 8.7.4 + + - Delete ProjectImportData record only if Project is not a mirror !370 + - Fixed typo in GitLab GEO license check alert !379 + - Fix LDAP access level spillover bug !499 + +## 8.7.3 + + - No EE-specific changes + +## 8.7.2 + + - Fix MR notifications for slack and hipchat when approvals are fullfiled. !325 + - GitLab Geo: Merge requests on Secondary should not check mergeable status + +## 8.7.1 + + - No EE-specific changes + +## 8.7.0 (2016-04-22) + + - Update GitLab Pages to 0.2.1: support user-defined 404 pages + - Refactor group sync to pull access level logic to its own class. !306 + - [Elastic] Stabilize database indexer if database is inconsistent + - Add ability to sync to remote mirrors. !249 + - GitLab Geo: Many replication improvements and fixes !354 + +## 8.6.9 + + - No EE-specific changes + +## 8.6.8 + + - No EE-specific changes + +## 8.6.7 + + - No EE-specific changes + +## 8.6.6 + + - Concat AD group recursive member results with regular member results. !333 + - Fix LDAP group sync regression for groups with member value `uid=<username>`. !335 + - Don't attempt to include too large diffs in e-mail-on-push messages (Stan Hu). !338 + +## 8.6.5 + + - No EE-specific changes + +## 8.6.4 + + - No EE-specific changes + +## 8.6.3 + + - Fix other cases where git hooks would fail due to old commits. !310 + - Exit ElasticIndexerWorker's job happily if record cannot be found. !311 + - Fix "Reload with full diff" button not working (Stan Hu). !313 + +## 8.6.2 + + - Fix old commits triggering git hooks on new branches branched off another branch. !281 + - Fix issue with deleted user in audit event (Stan Hu). !284 + - Mark pending todos as done when approving a merge request. !292 + - GitLab Geo: Display Attachments from Primary node. !302 + +## 8.6.1 + + - Only rename the `light_logo` column in the `appearances` table if its not there yet. !290 + - Fix diffs in text part of email-on-push messages (Stan Hu). !293 + - Fix an issue with methods not accessible in some controllers. !295 + - Ensure Projects::ApproversController inherits from Projects::ApplicationController. !296 + +## 8.6.0 (2016-03-22) + + - Handle duplicate appearances table creation issue with upgrade from CE to EE + - Add confidential issues + - Improve weight filter for issues + - Update settings and documentation for per-install LDAP sync time + - Fire merge request webhooks when a merge request is approved + - Add full diff highlighting to Email on push + - Clear "stuck" mirror updates before periodically updating all mirrors + - LDAP: Don't render Linked LDAP groups forms when LDAP is disabled + - [Elastic] Add elastic checker to gitlab:check + - [Elastic] Added UPDATE_INDEX option to rake task + - [Elastic] Removing repository and wiki index after removing project + - [Elastic] Update index on push to wiki + - [Elastic] Use subprocesses for ElasticSearch index jobs + - [Elastic] More accurate as_indexed_json (More stable database indexer) + - [Elastic] Fix: Don't index newly created system messages and awards + - [Elastic] Fixed exception on branch removing + - [Elastic] Fix bin/elastic_repo_indexer to follow config + - GitLab Geo: OAuth authentication + - GitLab Geo: Wiki synchronization + - GitLab Geo: ReadOnly Middleware improvements + - GitLab Geo: SSH Keys synchronization + - Allow SSL verification to be configurable when importing GitHub projects + - Disable git-hooks for git annex commits + +## 8.5.13 + + - No EE-specific changes + +## 8.5.12 + + - No EE-specific changes + +## 8.5.11 + + - Fix vulnerability that made it possible to enumerate private projects belonging to group + +## 8.5.10 + + - No EE-specific changes + +## 8.5.9 + + - No EE-specific changes + +## 8.5.8 + + - GitLab Geo: Documentation + +## 8.5.7 + + - No EE-specific changes + +## 8.5.6 + + - No EE-specific changes + +## 8.5.5 + + - GitLab Geo: Repository synchronization between primary and secondary nodes + - Add documentation for GitLab Pages + - Fix importing projects from GitHub Enterprise Edition + - Fix syntax error in init file + - Only show group member roles if explicitly requested + - GitLab Geo: Improve GeoNodes Admin screen + - GitLab Geo: Avoid locking yourself out when adding a GeoNode + +## 8.5.4 + + - [Elastic][Security] Notes exposure + +## 8.5.3 + + - Prevent LDAP from downgrading a group's last owner + - Update gitlab-elastic-search gem to 0.0.11 + +## 8.5.2 + + - Update LDAP groups asynchronously + - Fix an issue when weight text was displayed in Issuable collapsed sidebar +## 8.5.2 + + - Fix importing projects from GitHub Enterprise Edition. + +## 8.5.1 + + - Fix adding pages domain to projects in groups + +## 8.5.0 (2016-02-22) + + - Fix Elasticsearch blob results linking to the wrong reference ID (Stan Hu) + - Show warning when mirror repository default branch could not be updated because it has diverged from upstream. + - More reliable wiki indexer + - GitLab Pages gets support for custom domain and custom certificate + - Fix of Elastic indexer. It should not trigger record validation for projects + - Fix of Elastic indexer. Stabilze indexer when serialized data is corrupted + - [Elastic] Don't index unnecessary data into elastic + +## 8.4.11 + + - No EE-specific changes + +## 8.4.10 + + - No EE-specific changes + +## 8.4.9 + + - Fix vulnerability that made it possible to enumerate private projects belonging to group + +## 8.4.8 + + - No EE-specific changes + +## 8.4.7 + + - No EE-specific changes + +## 8.4.6 + + - No EE-specific changes + +## 8.4.5 + + - Update LDAP groups asynchronously + +## 8.4.4 + + - Re-introduce "Send email to users" link in Admin area + - Fix category values for Jenkins and JenkinsDeprecated services + - Fix Elasticsearch indexing for newly added snippets + - Make Elasticsearch indexer more stable + - Update gitlab-elasticsearch-git to 0.0.10 which contain a few important fixes + +## 8.4.3 + + - Elasticsearch: fix partial blob indexing on push + - Elasticsearch: added advanced indexer for repositories + - Fix Mirror User dropdown + +## 8.4.2 + + - Elasticsearch indexer performance improvements + - Don't redirect away from Mirror Repository settings when repo is empty + - Fix updating of branches in mirrored repository + - Fix a 500 error preventing LDAP users with 2FA enabled from logging in + - Rake task gitlab:elastic:index_repositories handles errors and shows progress + - Partial indexing of repo on push (indexing changes only) + +## 8.4.1 + + - No EE-specific changes + +## 8.4.0 (2016-01-22) + + - Add ability to create a note for user by admin + - Fix "Commit was rejected by git hook", when max_file_size was set null in project's Git hooks + - Fix "Approvals are not reset after a new push is made if the request is coming from a fork" + - Fix "User is not automatically removed from suggested approvers list if user is deleted" + - Add option to enforce a semi-linear history by only allowing merge requests to be merged that have been rebased + - Add option to trigger builds when branches or tags are updated from a mirrored upstream repository + - Ability to use Elasticsearch as a search engine + +## 8.3.10 + + - No EE-specific changes + +## 8.3.9 + + - No EE-specific changes + +## 8.3.8 + + - Fix vulnerability that made it possible to enumerate private projects belonging to group + +## 8.3.7 + + - No EE-specific changes + +## 8.3.6 + + - No EE-specific changes + +## 8.3.5 + + - No EE-specific changes + +## 8.3.4 + + - No EE-specific changes + +## 8.3.3 + + - Fix undefined method call in Jenkins integration service + +## 8.3.2 + + - No EE-specific changes + +## 8.3.1 + + - Rename "Group Statistics" to "Contribution Analytics" + +## 8.3.0 (2015-12-22) + + - License information can now be retrieved via the API + - Show Kerberos clone url when Kerberos enabled and url different than HTTP url (Borja Aparicio) + - Fix bug with negative approvals required + - Add group contribution analytics page + - Add GitLab Pages + - Add group contribution statistics page + - Automatically import Kerberos identities from Active Directory when Kerberos is enabled (Alex Lossent) + - Canonicalization of Kerberos identities to always include realm (Alex Lossent) + +## 8.2.6 + + - No EE-specific changes + +## 8.2.5 + + - No EE-specific changes + +## 8.2.4 + + - No EE-specific changes + +## 8.2.3 + + - No EE-specific changes + +## 8.2.2 + + - Fix 404 in redirection after removing a project (Stan Hu) + - Ensure cached application settings are refreshed at startup (Stan Hu) + - Fix Error 500 when viewing user's personal projects from admin page (Stan Hu) + - Fix: Raw private snippets access workflow + - Prevent "413 Request entity too large" errors when pushing large files with LFS + - Ensure GitLab fires custom update hooks after commit via UI + +## 8.2.1 + + - Forcefully update builds that didn't want to update with state machine + - Fix: saving GitLabCiService as Admin Template + +## 8.2.0 (2015-11-22) + + - Invalidate stored jira password if the endpoint URL is changed + - Fix: Page is not reloaded periodically to check if rebase is finished + - When someone as marked as a required approver for a merge request, an email should be sent + - Allow configuring the Jira API path (Alex Lossent) + - Fix "Rebase onto master" + - Ensure a comment is properly recorded in JIRA when a merge request is accepted + - Allow groups to appear in the `Share with group` share if the group owner allows it + - Add option to mirror an upstream repository. + +## 8.1.4 + + - Fix bug in JIRA integration which prevented merge requests from being accepted when using issue closing pattern + +## 8.1.3 + + - Fix "Rebase onto master" + +## 8.1.2 + + - Prevent a 500 error related to the JIRA external issue tracker service + +## 8.1.1 + + - Removed, see 8.1.2 + +## 8.1.0 (2015-10-22) + + - Add documentation for "Share project with group" API call + - Added an issues template (Hannes Rosenögger) + - Add documentation for "Share project with group" API call + - Ability to disable 'Share with Group' feature (via UI and API) + +## 8.0.6 + + - No EE-specific changes + +## 8.0.5 + + - "Multi-project" and "Treat unstable builds as passing" parameters for + the Jenkins CI service are now correctly persisted. + - Correct the build URL when "Multi-project" is enabled for the Jenkins CI + service. + +## 8.0.4 + + - Fix multi-project setup for Jenkins + +## 8.0.3 + + - No EE-specific changes + +## 8.0.2 + + - No EE-specific changes + +## 8.0.1 + + - Correct gem dependency versions + - Re-add the "Help Text" feature that was inadvertently removed + +## 8.0.0 (2015-09-22) + + - Fix navigation issue when viewing Group Settings pages + - Guests and Reporters can approve merge request as well + - Add fast-forward merge option in project settings + - Separate rebase & fast-forward merge features + +## 7.14.3 + + - No changes + +## 7.14.2 + + - Fix the rebase before merge feature + +## 7.14.1 + + - Fix sign in form when just Kerberos is enabled + +## 7.14.0 (2015-08-22) + + - Disable adding, updating and removing members from a group that is synced with LDAP + - Don't send "Added to group" notifications when group is LDAP synched + - Fix importing projects from GitHub Enterprise Edition. + - Automatic approver suggestions (based on an authority of the code) + - Add support for Jenkins unstable status + - Automatic approver suggestions (based on an authority of the code) + - Support Kerberos ticket-based authentication for Git HTTP access + +## 7.13.3 + + - Merge community edition changes for version 7.13.3 + - Improved validation for an approver + - Don't resend admin email to everyone if one delivery fails + - Added migration for removing of invalid approvers + +## 7.13.2 + + - Fix group web hook + - Don't resend admin email to everyone if one delivery fails + +## 7.13.1 + + - Merge community edition changes for version 7.13.1 + - Fix: "Rebase before merge" doesn't work when source branch is in the same project + +## 7.13.0 (2015-07-22) + + - Fix git hook validation on initial push to master branch. + - Reset approvals on push + - Fix 500 error when the source project of an MR is deleted + - Ability to define merge request approvers + +## 7.12.2 + + - Fixed the alignment of project settings icons + +## 7.12.1 + + - No changes specific to EE + +## 7.12.0 (2015-06-22) + + - Fix error when viewing merge request with a commit that includes "Closes #<issue id>". + - Enhance LDAP group synchronization to check also for member attributes that only contain "uid=<username>" + - Enhance LDAP group synchronization to check also for submember attributes + - Prevent LDAP group sync from removing a group's last owner + - Add Git hook to validate maximum file size. + - Project setting: approve merge request by N users before accept + - Support automatic branch jobs created by Jenkins in CI Status + - Add API support for adding and removing LDAP group links + +## 7.11.4 + + - no changes specific to EE + +## 7.11.3 + + - Fixed an issue with git annex + +## 7.11.2 + + - Fixed license upload and verification mechanism + +## 7.11.0 (2015-05-22) + + - Skip git hooks commit validation when pushing new tag. + - Add Two-factor authentication (2FA) for LDAP logins + +## 7.10.1 + + - Check if comment exists in Jira before sending a reference + +## 7.10.0 (2015-04-22) + + - Improve UI for next pages: Group LDAP sync, Project git hooks, Project share with groups, Admin -> Appearance settigns + - Default git hooks for new projects + - Fix LDAP group links page by using new group members route. + - Skip email confirmation when updated via LDAP. + +## 7.9.0 (2015-03-22) + + - Strip prefixes and suffixes from synced SSH keys: + `SSHKey:ssh-rsa keykeykey` and `ssh-rsa keykeykey (SSH key)` will now work + - Check if LDAP admin group exists before querying for user membership + - Use one custom header logo for all GitLab themes in appearance settings + - Escape wildcards when searching LDAP by group name. + - Group level Web Hooks + - Don't allow project to be shared with the group it is already in. + +## 7.8.0 (2015-02-22) + + - Improved Jira issue closing integration + - Improved message logging for Jira integration + - Added option of referencing JIRA issues from GitLab + - Update Sidetiq to 0.6.3 + - Added Github Enterprise importer + - When project has MR rebase enabled, MR will have rebase checkbox selected by default + - Minor UI fixes for sidebar navigation + - Manage large binaries with git annex + +## 7.7.0 (2015-01-22) + + - Added custom header logo support (Drew Blessing) + - Fixed preview appearance bug + - Improve performance for selectboxes: project share page, admin email users page + +## 7.6.2 + + - Fix failing migrations for MySQL, LDAP + +## 7.6.1 + + - No changes + +## 7.6.0 (2014-12-22) + + - Added Audit events related to membership changes for groups and projects + - Added option to attempt a rebase before merging merge request + - Dont show LDAP groups settings if LDAP disabled + - Added member lock for groups to disallow membership additions on project level + - Rebase on merge request. Introduced merge request option to rebase before merging + - Better message for failed pushes because of git hooks + - Kerberos support for web interface and git HTTP + +## 7.5.3 + + - Only set up Sidetiq from a Sidekiq server process (fixes Redis::InheritedError) + +## 7.5.0 (2014-11-22) + + - Added an ability to check each author commit's email by regex + - Added an ability to restrict commit authors to existing GitLab users + - Add an option for automatic daily LDAP user sync + - Added git hook for preventing tag removal to API + - Added git hook for setting commit message regex to API + - Added an ability to block commits with certain filenames by regex expression + - Improved a jenkins parser + +## 7.4.4 + + - Fix broken ldap migration + +## 7.4.0 (2014-10-22) + + - Support for multiple LDAP servers + - Skip AD specific LDAP checks + - Do not show ldap users in dropdowns for groups with enabled ldap-sync + - Update the JIRA integration documentation + - Reset the homepage to show the GitLab logo by deleting the custom logo. + +## 7.3.0 (2014-09-22) + + - Add an option to change the LDAP sync time from default 1 hour + - User will receive an email when unsubscribed from admin notifications + - Show group sharing members on /my/project/team + - Improve explanation of the LDAP permission reset + - Fix some navigation issues + - Added support for multiple LDAP groups per GitLab group + +## 7.2.0 (2014-08-22) + + - Improve Redmine integration + - Better logging for the JIRA issue closing service + - Administrators can now send email to all users through the admin interface + - JIRA issue transition ID is now customizable + - LDAP group settings are now visible in admin group show page and group members page + +## 7.1.0 (2014-07-22) + + - Synchronize LDAP-enabled GitLab administrators with an LDAP group (Marvin Frick, sponsored by SinnerSchrader) + - Synchronize SSH keys with LDAP (Oleg Girko (Jolla) and Marvin Frick (SinnerSchrader)) + - Support Jenkins jobs with multiple modules (Marvin Frick, sponsored by SinnerSchrader) + +## 7.0.0 (2014-06-22) + + - Fix: empty brand images are displayed as empty image_tag on login page (Marvin Frick, sponsored by SinnerSchrader) + +## 6.9.4 + + - Fix bug in JIRA Issue closing triggered by commit messages + - Fix JIRA issue reference bug + +## 6.9.3 + + - Fix check CI status only when CI service is enabled(Daniel Aquino) + +## 6.9.2 + + - Merge community edition changes for version 6.9.2 + +## 6.9.1 + + - Merge community edition changes for version 6.9.1 + +## 6.9.0 (2014-05-22) + + - Add support for closing Jira tickets with commits and MR + - Template for Merge Request description can be added in project settings + - Jenkins CI service + - Fix LDAP email upper case bug + +## 6.8.0 (2014-04-22) + + - Customise sign-in page with custom text and logo + +## 6.7.1 + + - Handle LDAP errors in Adapter#dn_matches_filter? + +## 6.7.0 (2014-03-22) + + - Improve LDAP sign-in speed by reusing connections + - Add support for Active Directory nested LDAP groups + - Git hooks: Commit message regex + - Git hooks: Deny git tag removal + - Fix group edit in admin area + +## 6.6.0 (2014-02-22) + + - Permission reset button for LDAP groups + - Better performance with large numbers of users with access to one project + +## 6.5.0 (2014-01-22) + + - Add reset permissions button to Group#members page + +## 6.4.0 (2013-12-22) + + - Respect existing group permissions during sync with LDAP group (d3844662ec7ce816b0a85c8b40f66ee6c5ae90a1) + +## 6.3.0 (2013-11-22) + + - When looking up a user by DN, use single scope (bc8a875df1609728f1c7674abef46c01168a0d20) + - Try sAMAccountName if omniauth nickname is nil (9b7174c333fa07c44cc53b80459a115ef1856e38) + +## 6.2.0 (2013-10-22) + + - API: expose ldap_cn and ldap_access group attributes + - Use omniauth-ldap nickname attribute as GitLab username + - Improve group sharing UI for installation with many groups + - Fix empty LDAP group raises exception + - Respect LDAP user filter for git access diff --git a/CHANGELOG.md b/CHANGELOG.md index e379c23ee3c..6b446b3533b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ entry. ## 12.2.3 +- No changes. + +## 12.2.2 + ### Security (22 changes) - Ensure only authorised users can create notes on Merge Requests and Issues. @@ -54,11 +58,16 @@ entry. - Fix SSRF via DNS rebinding in Kubernetes Integration. -## 12.2.2 +## 12.2.1 -- Unreleased due to QA failure. +### Fixed (2 changes) -## 12.2.1 +- Fix for embedded metrics undefined params. !31975 +- Fix "ERR value is not an integer or out of range" errors. !32126 + +### Performance (1 change) + +- Fix Gitaly N+1 calls with listing issues/MRs via API. !31938 ### Fixed (3 changes) @@ -721,16 +730,16 @@ entry. ### Security (10 changes) +- Prevent bypass of restriction disabling web password sign in. - Hide confidential issue title on unsubscribe for anonymous users. +- Resolve: Milestones leaked via search API. - Fix url redaction for issue links. +- Add extra fields for handling basic auth on import by url page. - Fix confidential issue label disclosure on milestone view. - Filter relative links in wiki for XSS. +- Prevent invalid branch for merge request. - Prevent XSS injection in note imports. -- Resolve: Milestones leaked via search API. -- Prevent bypass of restriction disabling web password sign in. -- Add extra fields for handling basic auth on import by url page. - Protect Gitlab::HTTP against DNS rebinding attack. -- Prevent invalid branch for merge request. ### Removed (5 changes, 1 of them is from the community) @@ -740,7 +749,7 @@ entry. - Make Kubernetes service templates readonly. !29044 - Remove Content-Type override for Mattermost OAuth login. (Harrison Healey) -### Fixed (116 changes, 28 of them are from the community) +### Fixed (115 changes, 28 of them are from the community) - Fix col-sm-* in forms to keep layout. !24885 (Takuya Noguchi) - Avoid 500 when rendering users ATOM data. !25408 @@ -753,7 +762,6 @@ entry. - Bring secondary button styles up to design standard. !27920 - Use FindOrCreateService to create labels and check for existing ones. !27987 (Matt Duren) - Fix "too many loops" error by handling gracefully cron schedules for non existent days. !28002 -- Handle errors in successful notes reply. !28082 - Fix 500 error when accessing charts with an anonymous user. !28091 (Diego Silva) - Allow user to set primary email first when 2FA is required. !28097 (Kartikey Tanna) - Auto-DevOps: allow to disable rollout status check. !28130 (Sergej Nikolaev <kinolaev@gmail.com>) @@ -850,14 +858,14 @@ entry. - Move Dropdown to Stick to MR View App Button. !29767 - Fix IDE commit using latest ref in branch and overriding contents. !29769 - Revert concurrent pipeline creation for pipeline schedules. !29794 -- Fix layout of group milestone header. -- Fix remote mirrors not updating after tag push. +- Fix border radii on diff files and repo files. - Fix padding of unclickable pipeline dropdown items to match links. +- Fix pipeline schedules when owner is nil. +- Fix remote mirrors not updating after tag push. +- Fix layout of group milestone header. +- Fixed show whitespace button not refetching diff content. - Change resolve button text to mark comment as resolved. - Align system note within discussion with other notes. -- Fix border radii on diff files and repo files. -- Fixed show whitespace button not refetching diff content. -- Fix pipeline schedules when owner is nil. ### Changed (35 changes, 13 of them are from the community) @@ -957,9 +965,9 @@ entry. - Link to an external dashboard from metrics dashboard. !29369 - Add labels to note event payload. !29384 (Sujay Patel) - Add Join meeting button to issues with Zoom links. !29454 -- Make task completion status available via GraphQL. - Add backtraces to Peek performance bar for SQL calls. - Added diff suggestion feature discovery popover. +- Make task completion status available via GraphQL. ### Other (62 changes, 14 of them are from the community) @@ -1014,17 +1022,17 @@ entry. - Changed the 'Created' label to 'Last Updated' on the container registry table to more accurately reflect what the date represents. !29464 - Update GitLab Pages to v1.6.1. !29559 - Indent collapsible sections. !29804 -- Group download buttons into a .btn-group. -- Change default color of award emoji button. -- Use blue for activity stream links; use monospace font for commit sha. +- Use grid and correct border radius for status badge. - Remove fixed height from MR diff headers. -- Moves the table pagination shared component. -- Add warning that gitlab-secrets isn't included in backup. -- Update merge request tabs so they no longer scroll. +- Use blue for activity stream links; use monospace font for commit sha. +- Moves snowplow to CE repo. - Reduce height of issue board input to align with buttons. +- Change default color of award emoji button. +- Group download buttons into a .btn-group. +- Add warning that gitlab-secrets isn't included in backup. - Increase height of move issue dropdown. -- Use grid and correct border radius for status badge. -- Moves snowplow to CE repo. +- Update merge request tabs so they no longer scroll. +- Moves the table pagination shared component. ## 11.11.8 @@ -1093,7 +1101,7 @@ entry. - Destroy project remote mirrors instead of disabling. !27087 -### Fixed (74 changes, 19 of them are from the community) +### Fixed (75 changes, 19 of them are from the community) - Don't create a temp reference for branch comparisons within project. !24038 - Fix some label links not appearing on group labels page and label title being a link on project labels page. !24060 (Tanya Pazitny) @@ -1154,6 +1162,7 @@ entry. - Fix uploading of LFS tracked file through UI. !28052 - Render Next badge only for gitlab.com. !28056 - Fix update head pipeline process of Pipelines for merge requests. !28057 +- Handle errors in successful notes reply. !28082 - Fix visual issues in set status modal. !28147 - Use a path for the related merge requests endpoint. !28171 - disable SSH key validation in key details view. !28180 (Roger Meier) @@ -1164,10 +1173,10 @@ entry. - Fix project visibility level validation. !28305 (Peter Marko) - Fix incorrect prefix used in new uploads for personal snippets. !28337 - Fix Rugged get_tree_entries recursive flag not working. !28494 -- Fixes next badge being always visible. - Next badge must visible when canary flag is true. -- Adds arrow icons to select option in CI/CD settings. - Vertically aligns the play button for stages. +- Fixes next badge being always visible. +- Adds arrow icons to select option in CI/CD settings. - Allow replying to individual notes from API. ### Changed (19 changes, 3 of them are from the community) @@ -1234,10 +1243,10 @@ entry. - Leave project/group from access granted email. !27892 - Allow Sentry client-side DSN to be passed on gitlab.yml. !27967 - GraphQL: improve evaluation of query complexity based on arguments and query limits. !28017 -- Adds badge for Canary environment and help link. - Support negative matches. -- Show category icons in user popover. - Added Omniauth UltraAuth strategy to GitLab. (Kartikey Tanna) +- Adds badge for Canary environment and help link. +- Show category icons in user popover. ### Other (29 changes, 8 of them are from the community) @@ -1267,9 +1276,22 @@ entry. - Remove the note in the docs that multi-line suggestions are not yet available. !28119 (hardysim) - Update gitlab-shell to v9.1.0. !28184 - Add EE fixtures to SeedFu list. !28241 +- Add some frozen string to spec/**/*.rb. (gfyoung) - Replaces CSS with BS4 utility class for pipeline schedules. - Creates a vendors folder for external CSS. -- Add some frozen string to spec/**/*.rb. (gfyoung) + +### Performance (1 change) + +- Add improvements to global search of issues and merge requests. !27817 + + +## 11.10.7 (2019-06-26) + +### Fixed (3 changes) + +- Remove a default git depth in Pipelines for merge requests. !28926 +- Fix label click scrolling to top. !29202 +- Fix scrolling to top on assignee change. !29500 ## 11.10.8 (2019-06-27) @@ -1309,7 +1331,6 @@ entry. - Fix input group height. - ## 11.10.4 (2019-05-01) ### Fixed (12 changes) @@ -1685,31 +1706,11 @@ entry. ## 11.9.3 (2019-03-27) -### Security (8 changes) - -- Disallow guest users from accessing Releases. -- Fix PDF.js vulnerability. -- Hide "related branches" when user does not have permission. -- Fix XSS in resolve conflicts form. -- Added rake task for removing EXIF data from existing uploads. -- Return cached languages if they've been detected before. -- Disallow updating namespace when updating a project. -- Use UntrustedRegexp for matching refs policy. - +- No changes. ## 11.9.2 (2019-03-26) -### Security (8 changes) - -- Disallow guest users from accessing Releases. -- Fix PDF.js vulnerability. -- Hide "related branches" when user does not have permission. -- Fix XSS in resolve conflicts form. -- Added rake task for removing EXIF data from existing uploads. -- Return cached languages if they've been detected before. -- Disallow updating namespace when updating a project. -- Use UntrustedRegexp for matching refs policy. - +- No changes. ## 11.9.1 (2019-03-25) @@ -2324,16 +2325,7 @@ entry. ## 11.7.8 (2019-03-26) -### Security (7 changes) - -- Disallow guest users from accessing Releases. -- Fix PDF.js vulnerability. -- Hide "related branches" when user does not have permission. -- Fix XSS in resolve conflicts form. -- Added rake task for removing EXIF data from existing uploads. -- Disallow updating namespace when updating a project. -- Use UntrustedRegexp for matching refs policy. - +- No changes. ## 11.7.7 (2019-03-19) @@ -2343,7 +2335,7 @@ entry. - Fixed ability to see private groups by users not belonging to given group. -## 11.7.5 (2019-02-06) +## 11.7.5 (2019-02-05) ### Fixed (8 changes) @@ -2582,10 +2574,9 @@ entry. ## 11.6.11 (2019-04-23) -### Security (2 changes) +### Security (1 change) - Fixed ability to see private groups by users not belonging to given group. -- Fix XSS in resolve conflicts form. ### Fixed (2 changes) @@ -2631,6 +2622,13 @@ entry. - Fix leaking private repository information in API. +## 11.6.9 (2019-02-04) + +### Security (1 change) + +- Use sanitized user status message for user popover. + + ## 11.6.8 (2019-01-30) - No changes. @@ -3155,7 +3153,6 @@ entry. - Fix a race condition intermittently breaking GitLab startup. !23028 - Adds margin after a deleted branch name in the activity feed. !23038 - Ignore environment validation failure. !23100 -- Fixes broken borders for reports section in MR widget. - Adds CI favicon back to jobs page. - Redirect to the pipeline builds page when a build is canceled. (Eva Kadlecova) - Fixed diff stats not showing when performance bar is enabled. @@ -3164,12 +3161,13 @@ entry. - Fix bug causing not all emails to show up in commit email selectbox. - Remove duplicate escape in job sidebar. - Fixing styling issues on the scheduled pipelines page. +- Fixes broken test in master. - Renders stuck block when runners are stuck. - Removes extra border from test reports in the merge request widget. +- Fixes broken borders for reports section in MR widget. - Only render link to branch when branch still exists in pipeline page. - Fixed source project not filtering in merge request creation compare form. - Do not reload self on hooks when creating deployment. -- Fixes broken test in master. ### Changed (38 changes, 12 of them are from the community) @@ -9627,4 +9625,3 @@ entry. ## 8.15.8 through 0.8.0 - See [changelogs/archive.md](changelogs/archive.md) - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4c954448a5..030624b8df9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,13 +1,9 @@ -## Developer Certificate of Origin + License +## Contributor license agreement -By contributing to GitLab B.V., You accept and agree to the following terms and -conditions for Your present and future Contributions submitted to GitLab B.V. -Except for the license granted herein to GitLab B.V. and recipients of software -distributed by GitLab B.V., You reserve all right, title, and interest in and to -Your Contributions. All Contributions are subject to the following DCO + License -terms. - -[DCO + License](https://gitlab.com/gitlab-org/dco/blob/master/README.md) +By submitting code as an individual you agree to the +[individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md). +By submitting code as an entity you agree to the +[corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md). All Documentation content that resides under the [doc/ directory](/doc) of this repository is licensed under Creative Commons: @@ -48,6 +48,9 @@ gem 'omniauth-salesforce', '~> 1.0.5' gem 'rack-oauth2', '~> 1.9.3' gem 'jwt', '~> 2.1.0' +# Kerberos authentication. EE-only +gem 'gssapi', group: :kerberos + # Spam and anti-bot protection gem 'recaptcha', '~> 4.11', require: 'recaptcha/rails' gem 'akismet', '~> 2.0' @@ -124,6 +127,13 @@ gem 'unf', '~> 0.1.4' # Seed data gem 'seed-fu', '~> 2.3.7' +# Search +gem 'elasticsearch-model', '~> 0.1.9' +gem 'elasticsearch-rails', '~> 0.1.9', require: 'elasticsearch/rails/instrumentation' +gem 'elasticsearch-api', '5.0.3' +gem 'aws-sdk' +gem 'faraday_middleware-aws-signers-v4' + # Markdown and HTML processing gem 'html-pipeline', '~> 2.8' gem 'deckar01-task_list', '2.2.0' @@ -281,6 +291,8 @@ gem 'gon', '~> 6.2' gem 'request_store', '~> 1.3' gem 'base32', '~> 0.3.0' +gem "gitlab-license", "~> 1.0" + # Sentry integration gem 'sentry-raven', '~> 2.9' @@ -420,6 +432,9 @@ gem 'health_check', '~> 2.6.0' gem 'vmstat', '~> 2.3.0' gem 'sys-filesystem', '~> 1.1.6' +# NTP client +gem 'net-ntp' + # SSH host key support gem 'net-ssh', '~> 5.2' gem 'sshkey', '~> 2.0' @@ -449,5 +464,8 @@ gem 'unleash', '~> 0.1.5' gem 'lograge', '~> 0.5' gem 'grape_logging', '~> 1.7' +# DNS Lookup +gem 'net-dns', '~> 0.9.0' + # Countries list gem 'countries', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 3952d068678..581730b208c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,6 +80,14 @@ GEM encryptor (~> 3.0.0) attr_required (1.0.1) awesome_print (1.8.0) + aws-sdk (2.9.32) + aws-sdk-resources (= 2.9.32) + aws-sdk-core (2.9.32) + aws-sigv4 (~> 1.0) + jmespath (~> 1.0) + aws-sdk-resources (2.9.32) + aws-sdk-core (= 2.9.32) + aws-sigv4 (1.0.0) axiom-types (0.1.1) descendants_tracker (~> 0.0.4) ice_nine (~> 0.11.0) @@ -226,6 +234,19 @@ GEM doorkeeper (~> 4.3) json-jwt (~> 1.6) ed25519 (1.2.4) + elasticsearch (5.0.3) + elasticsearch-api (= 5.0.3) + elasticsearch-transport (= 5.0.3) + elasticsearch-api (5.0.3) + multi_json + elasticsearch-model (0.1.9) + activesupport (> 3) + elasticsearch (> 0.4) + hashie + elasticsearch-rails (0.1.9) + elasticsearch-transport (5.0.3) + faraday + multi_json email_reply_trimmer (0.1.6) email_spec (2.2.0) htmlentities (~> 4.3.3) @@ -254,6 +275,9 @@ GEM faraday (~> 0.8) faraday_middleware (0.12.2) faraday (>= 0.7.4, < 1.0) + faraday_middleware-aws-signers-v4 (0.1.7) + aws-sdk-resources (~> 2) + faraday (~> 0.9) faraday_middleware-multi_json (0.0.6) faraday_middleware multi_json @@ -344,6 +368,7 @@ GEM jaeger-client (~> 0.10) opentracing (~> 0.4) redis (> 3.0.0, < 5.0.0) + gitlab-license (1.0.0) gitlab-markup (1.7.0) gitlab-peek (0.0.1) railties (>= 4.0.0) @@ -417,6 +442,8 @@ GEM grpc (1.19.0) google-protobuf (~> 3.1) googleapis-common-protos-types (~> 1.0.0) + gssapi (1.2.0) + ffi (>= 1.0.1) haml (5.0.4) temple (>= 0.8.0) tilt @@ -480,6 +507,7 @@ GEM atlassian-jwt multipart-post oauth (~> 0.5, >= 0.5.0) + jmespath (1.3.1) js_regex (3.1.1) character_set (~> 1.1) regexp_parser (~> 1.1) @@ -568,7 +596,9 @@ GEM mustermann (~> 1.0.0) nakayoshi_fork (0.0.4) nap (1.1.0) + net-dns (0.9.0) net-ldap (0.16.0) + net-ntp (2.1.3) net-ssh (5.2.0) netrc (0.11.0) nio4r (2.3.1) @@ -961,7 +991,7 @@ GEM sys-filesystem (1.1.6) ffi sysexits (1.2.0) - temple (0.8.0) + temple (0.8.1) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) test-prof (0.2.5) @@ -973,7 +1003,7 @@ GEM thor (0.19.4) thread_safe (0.3.6) thrift (0.11.0.0) - tilt (2.0.8) + tilt (2.0.9) timecop (0.8.1) timfel-krb5-auth (0.8.3) toml (0.2.0) @@ -1070,6 +1100,7 @@ DEPENDENCIES atlassian-jwt (~> 0.2.0) attr_encrypted (~> 3.1.0) awesome_print + aws-sdk babosa (~> 1.0.2) base32 (~> 0.3.0) batch-loader (~> 1.4.0) @@ -1107,11 +1138,15 @@ DEPENDENCIES doorkeeper (~> 4.3) doorkeeper-openid_connect (~> 1.5) ed25519 (~> 1.2) + elasticsearch-api (= 5.0.3) + elasticsearch-model (~> 0.1.9) + elasticsearch-rails (~> 0.1.9) email_reply_trimmer (~> 0.1) email_spec (~> 2.2.0) escape_utils (~> 1.1) factory_bot_rails (~> 4.8.2) faraday (~> 0.12) + faraday_middleware-aws-signers-v4 fast_blank ffaker (~> 2.10) flipper (~> 0.13.0) @@ -1136,6 +1171,7 @@ DEPENDENCIES gitaly (~> 1.58.0) github-markup (~> 1.7.0) gitlab-labkit (~> 0.5) + gitlab-license (~> 1.0) gitlab-markup (~> 1.7.0) gitlab-peek (~> 0.0.1) gitlab-sidekiq-fetcher (= 0.5.2) @@ -1154,6 +1190,7 @@ DEPENDENCIES graphql (~> 1.9.11) graphql-docs (~> 1.6.0) grpc (~> 1.19.0) + gssapi haml_lint (~> 0.31.0) hamlit (~> 2.8.8) hangouts-chat (~> 0.0.5) @@ -1185,7 +1222,9 @@ DEPENDENCIES mini_magick minitest (~> 5.11.0) nakayoshi_fork (~> 0.0.4) + net-dns (~> 0.9.0) net-ldap + net-ntp net-ssh (~> 5.2) nokogiri (~> 1.10.4) oauth2 (~> 1.4) diff --git a/app/assets/javascripts/boards/models/list.js b/app/assets/javascripts/boards/models/list.js index 080841ee82b..1edaf971afd 100644 --- a/app/assets/javascripts/boards/models/list.js +++ b/app/assets/javascripts/boards/models/list.js @@ -3,7 +3,7 @@ import { __ } from '~/locale'; import ListLabel from './label'; import ListAssignee from './assignee'; -import ListIssue from './issue'; +import ListIssue from 'ee_else_ce/boards/models/issue'; import { urlParamsToObject } from '~/lib/utils/common_utils'; import boardsStore from '../stores/boards_store'; import ListMilestone from './milestone'; diff --git a/app/assets/javascripts/clusters/clusters_bundle.js b/app/assets/javascripts/clusters/clusters_bundle.js index 1f213d5aaf2..28850710f80 100644 --- a/app/assets/javascripts/clusters/clusters_bundle.js +++ b/app/assets/javascripts/clusters/clusters_bundle.js @@ -39,6 +39,7 @@ export default class Clusters { updateKnativePath, installPrometheusPath, managePrometheusPath, + clusterEnvironmentsPath, hasRbac, clusterType, clusterStatus, @@ -79,6 +80,7 @@ export default class Clusters { installJupyterEndpoint: installJupyterPath, installKnativeEndpoint: installKnativePath, updateKnativeEndpoint: updateKnativePath, + clusterEnvironmentsEndpoint: clusterEnvironmentsPath, }); this.installApplication = this.installApplication.bind(this); @@ -109,6 +111,10 @@ export default class Clusters { this.initApplications(clusterType); this.initEnvironments(); + if (clusterEnvironmentsPath) { + this.fetchEnvironments(); + } + this.updateContainer(null, this.store.state.status, this.store.state.statusReason); this.addListeners(); @@ -162,6 +168,7 @@ export default class Clusters { render(createElement) { return createElement(Environments, { props: { + isFetching: this.state.fetchingEnvironments, environments: this.state.environments, environmentsHelpPath: this.state.environmentsHelpPath, clustersHelpPath: this.state.clustersHelpPath, @@ -172,6 +179,18 @@ export default class Clusters { }); } + fetchEnvironments() { + this.store.toggleFetchEnvironments(true); + + this.service + .fetchClusterEnvironments() + .then(data => { + this.store.toggleFetchEnvironments(false); + this.store.updateEnvironments(data.data); + }) + .catch(() => Clusters.handleError()); + } + static initDismissableCallout() { const callout = document.querySelector('.js-cluster-security-warning'); PersistentUserCallout.factory(callout); diff --git a/app/assets/javascripts/clusters/services/clusters_service.js b/app/assets/javascripts/clusters/services/clusters_service.js index 01f3732de7e..9139e0beafb 100644 --- a/app/assets/javascripts/clusters/services/clusters_service.js +++ b/app/assets/javascripts/clusters/services/clusters_service.js @@ -33,6 +33,10 @@ export default class ClusterService { return axios.delete(this.appInstallEndpointMap[appId], params); } + fetchClusterEnvironments() { + return axios.get(this.options.clusterEnvironmentsEndpoint); + } + static updateCluster(endpoint, data) { return axios.put(endpoint, data); } diff --git a/app/assets/javascripts/clusters/stores/clusters_store.js b/app/assets/javascripts/clusters/stores/clusters_store.js index 83533c88f69..a032f589ee4 100644 --- a/app/assets/javascripts/clusters/stores/clusters_store.js +++ b/app/assets/javascripts/clusters/stores/clusters_store.js @@ -84,6 +84,7 @@ export default class ClusterStore { }, }, environments: [], + fetchingEnvironments: false, }; } @@ -206,6 +207,10 @@ export default class ClusterStore { }); } + toggleFetchEnvironments(isFetching) { + this.state.fetchingEnvironments = isFetching; + } + updateEnvironments(environments = []) { this.state.environments = environments.map(environment => ({ name: environment.name, @@ -215,7 +220,7 @@ export default class ClusterStore { rolloutStatus: { instances: environment.rollout_status ? environment.rollout_status.instances : [], }, - updatedAt: environment.updatedAt, + updatedAt: environment.updated_at, })); } } diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index bdb50606a53..515402fc506 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -7,6 +7,7 @@ import fuzzaldrinPlus from 'fuzzaldrin-plus'; import axios from './lib/utils/axios_utils'; import { visitUrl } from './lib/utils/url_utility'; import { isObject } from './lib/utils/type_utility'; +import renderItem from './gl_dropdown/render'; var GitLabDropdown, GitLabDropdownFilter, GitLabDropdownRemote, GitLabDropdownInput; @@ -521,8 +522,8 @@ GitLabDropdown = (function() { html.push( this.renderItem( { - header: name, - // Add header for each group + content: name, + type: 'header', }, name, ), @@ -542,16 +543,7 @@ GitLabDropdown = (function() { }; GitLabDropdown.prototype.renderData = function(data, group) { - if (group == null) { - group = false; - } - return data.map( - (function(_this) { - return function(obj, index) { - return _this.renderItem(obj, group, index); - }; - })(this), - ); + return data.map((obj, index) => this.renderItem(obj, group || false, index)); }; GitLabDropdown.prototype.shouldPropagate = function(e) { @@ -688,104 +680,25 @@ GitLabDropdown = (function() { }; GitLabDropdown.prototype.renderItem = function(data, group, index) { - var field, html, selected, text, url, value, rowHidden; - - if (!this.options.renderRow) { - value = this.options.id ? this.options.id(data) : data.id; - - if (value) { - value = value.toString().replace(/'/g, "\\'"); - } - } - - // Hide element - if (this.options.hideRow && this.options.hideRow(value)) { - rowHidden = true; - } - if (group == null) { - group = false; - } - if (index == null) { - // Render the row - index = false; - } - html = document.createElement('li'); - - if (rowHidden) { - html.style.display = 'none'; - } - - if (data === 'divider' || data === 'separator') { - html.className = data; - return html; - } - // Header - if (data.header != null) { - html.className = 'dropdown-header'; - html.innerHTML = data.header; - return html; - } - if (this.options.renderRow) { - // Call the render function - html = this.options.renderRow.call(this.options, data, this); - } else { - if (!selected) { - const { fieldName } = this.options; - - if (value) { - field = this.dropdown.parent().find(`input[name='${fieldName}'][value='${value}']`); - if (field.length) { - selected = true; - } - } else { - field = this.dropdown.parent().find(`input[name='${fieldName}']`); - selected = !field.length; - } - } - // Set URL - if (this.options.url != null) { - url = this.options.url(data); - } else { - url = data.url != null ? data.url : '#'; - } - // Set Text - if (this.options.text != null) { - text = this.options.text(data); - } else { - text = data.text != null ? data.text : ''; - } - if (this.highlight) { - text = data.template - ? this.highlightTemplate(text, data.template) - : this.highlightTextMatches(text, this.filterInput.val()); - } - // Create the list item & the link - var link = document.createElement('a'); - - link.href = url; - - if (this.icon) { - text = `<span>${text}</span>`; - link.classList.add('d-flex', 'align-items-center'); - link.innerHTML = data.icon ? data.icon + text : text; - } else if (this.highlight) { - link.innerHTML = text; - } else { - link.textContent = text; - } - - if (selected) { - link.classList.add('is-active'); - } - - if (group) { - link.dataset.group = group; - link.dataset.index = index; - } - - html.appendChild(link); - } - return html; + let parent; + + if (this.dropdown && this.dropdown[0]) { + parent = this.dropdown[0].parentNode; + } + + return renderItem({ + instance: this, + options: Object.assign({}, this.options, { + icon: this.icon, + highlight: this.highlight, + highlightText: text => this.highlightTextMatches(text, this.filterInput.val()), + highlightTemplate: this.highlightTemplate.bind(this), + parent, + }), + data, + group, + index, + }); }; GitLabDropdown.prototype.highlightTemplate = function(text, template) { @@ -809,7 +722,6 @@ GitLabDropdown = (function() { }; GitLabDropdown.prototype.noResults = function() { - var html; return '<li class="dropdown-menu-empty-item"><a>No matching results</a></li>'; }; diff --git a/app/assets/javascripts/gl_dropdown/render.js b/app/assets/javascripts/gl_dropdown/render.js new file mode 100644 index 00000000000..66546aa834f --- /dev/null +++ b/app/assets/javascripts/gl_dropdown/render.js @@ -0,0 +1,158 @@ +const renderersByType = { + divider(element) { + element.classList.add('divider'); + + return element; + }, + separator(element) { + element.classList.add('separator'); + + return element; + }, + header(element, data) { + element.classList.add('dropdown-header'); + element.innerHTML = data.content; + + return element; + }, +}; + +function getPropertyWithDefault(data, options, property, defaultValue = '') { + let result; + + if (options[property] != null) { + result = options[property](data); + } else { + result = data[property] != null ? data[property] : defaultValue; + } + + return result; +} + +function getHighlightTextBuilder(text, data, options) { + if (options.highlight) { + return data.template + ? options.highlightTemplate(text, data.template) + : options.highlightText(text); + } + + return text; +} + +function getIconTextBuilder(text, data, options) { + if (options.icon) { + const wrappedText = `<span>${text}</span>`; + return data.icon ? `${data.icon}${wrappedText}` : wrappedText; + } + + return text; +} + +function getLinkText(data, options) { + const text = getPropertyWithDefault(data, options, 'text'); + + return [getHighlightTextBuilder, getIconTextBuilder].reduce( + (acc, fn) => fn(acc, data, options), + text, + ); +} + +function escape(text) { + return text ? String(text).replace(/'/g, "\\'") : text; +} + +function getOptionValue(data, options) { + if (options.renderRow) { + return undefined; + } + + return escape(options.id ? options.id(data) : data.id); +} + +function shouldHide(data, { options }) { + const value = getOptionValue(data, options); + + return options.hideRow && options.hideRow(value); +} + +function hideElement(element) { + element.style.display = 'none'; + + return element; +} + +function checkSelected(data, options) { + const value = getOptionValue(data, options); + + if (!options.parent) { + return !data.id; + } else if (value) { + return ( + options.parent.querySelector(`input[name='${options.fieldName}'][value='${value}']`) != null + ); + } + + return options.parent.querySelector(`input[name='${options.fieldName}']`) == null; +} + +function createLink(url, selected, options) { + const link = document.createElement('a'); + + link.href = url; + + if (options.icon) { + link.classList.add('d-flex', 'align-items-center'); + } + + link.classList.toggle('is-active', selected); + + return link; +} + +function assignTextToLink(el, data, options) { + const text = getLinkText(data, options); + + if (options.icon || options.highlight) { + el.innerHTML = text; + } else { + el.textContent = text; + } + + return el; +} + +function renderLink(row, data, { options, group, index }) { + const selected = checkSelected(data, options); + const url = getPropertyWithDefault(data, options, 'url', '#'); + const link = createLink(url, selected, options); + + assignTextToLink(link, data, options); + + if (group) { + link.dataset.group = group; + link.dataset.index = index; + } + + row.appendChild(link); + + return row; +} + +function getOptionRenderer({ options, instance }) { + return options.renderRow && ((li, data) => options.renderRow(data, instance)); +} + +function getRenderer(data, params) { + return renderersByType[data.type] || getOptionRenderer(params) || renderLink; +} + +export default function item({ data, ...params }) { + const renderer = getRenderer(data, params); + const li = document.createElement('li'); + + if (shouldHide(data, params)) { + hideElement(li); + } + + return renderer(li, data, params); +} diff --git a/app/assets/javascripts/groups/transfer_dropdown.js b/app/assets/javascripts/groups/transfer_dropdown.js index cec824a529c..e94b163dfb1 100644 --- a/app/assets/javascripts/groups/transfer_dropdown.js +++ b/app/assets/javascripts/groups/transfer_dropdown.js @@ -14,7 +14,7 @@ export default class TransferDropdown { } buildDropdown() { - const extraOptions = [{ id: '-1', text: __('No parent group') }, 'divider']; + const extraOptions = [{ id: '-1', text: __('No parent group') }, { type: 'divider' }]; this.groupDropdown.glDropdown({ selectable: true, diff --git a/app/assets/javascripts/jobs/components/environments_block.vue b/app/assets/javascripts/jobs/components/environments_block.vue index 132e50e5715..8cda7dac51f 100644 --- a/app/assets/javascripts/jobs/components/environments_block.vue +++ b/app/assets/javascripts/jobs/components/environments_block.vue @@ -79,7 +79,9 @@ export default { default: break; } - return environmentText; + return environmentText && this.hasCluster + ? `${environmentText} ${this.clusterText}` + : environmentText; }, environmentLink() { if (this.hasEnvironment) { @@ -109,6 +111,37 @@ export default { ? this.lastDeployment.deployable.build_path : ''; }, + hasCluster() { + return this.hasLastDeployment && this.lastDeployment.cluster; + }, + clusterNameOrLink() { + if (!this.hasCluster) { + return ''; + } + + const { name, path } = this.lastDeployment.cluster; + const escapedName = _.escape(name); + const escapedPath = _.escape(path); + + if (!escapedPath) { + return escapedName; + } + + return sprintf( + '%{startLink}%{name}%{endLink}', + { + startLink: `<a href="${escapedPath}" class="js-job-cluster-link">`, + name: escapedName, + endLink: '</a>', + }, + false, + ); + }, + clusterText() { + return this.hasCluster + ? sprintf(__('Cluster %{cluster} was used.'), { cluster: this.clusterNameOrLink }, false) + : ''; + }, }, methods: { deploymentLink(name) { diff --git a/app/assets/javascripts/labels_select.js b/app/assets/javascripts/labels_select.js index f50a6e3b19d..177aa02b8e0 100644 --- a/app/assets/javascripts/labels_select.js +++ b/app/assets/javascripts/labels_select.js @@ -231,7 +231,7 @@ export default class LabelsSelect { }); } if (extraData.length) { - extraData.push('divider'); + extraData.push({ type: 'divider' }); data = extraData.concat(data); } } @@ -243,7 +243,7 @@ export default class LabelsSelect { }) .catch(() => flash(__('Error fetching labels.'))); }, - renderRow: function(label, instance) { + renderRow: function(label) { var linkEl, listItemEl, color, diff --git a/app/assets/javascripts/milestone_select.js b/app/assets/javascripts/milestone_select.js index 43949d5cc86..8f077685b07 100644 --- a/app/assets/javascripts/milestone_select.js +++ b/app/assets/javascripts/milestone_select.js @@ -100,7 +100,7 @@ export default class MilestoneSelect { }); } if (extraOptions.length) { - extraOptions.push('divider'); + extraOptions.push({ type: 'divider' }); } callback(extraOptions.concat(data)); diff --git a/app/assets/javascripts/namespace_select.js b/app/assets/javascripts/namespace_select.js index 03d349ac714..2ef081837e6 100644 --- a/app/assets/javascripts/namespace_select.js +++ b/app/assets/javascripts/namespace_select.js @@ -34,7 +34,7 @@ export default class NamespaceSelect { id: null, }; namespaces.unshift(anyNamespace); - namespaces.splice(1, 0, 'divider'); + namespaces.splice(1, 0, { type: 'divider' }); } return dataCallback(namespaces); }); diff --git a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js index 0d377eb9c68..95936c2d1db 100644 --- a/app/assets/javascripts/pages/profiles/two_factor_auths/index.js +++ b/app/assets/javascripts/pages/profiles/two_factor_auths/index.js @@ -7,7 +7,7 @@ document.addEventListener('DOMContentLoaded', () => { const skippable = parseBoolean(twoFactorNode.dataset.twoFactorSkippable); if (skippable) { - const button = `<a class="btn btn-sm btn-warning float-right" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>`; + const button = `<a class="btn btn-sm btn-warning float-right" data-qa-selector="configure_it_later_button" data-method="patch" href="${twoFactorNode.dataset.two_factor_skip_url}">Configure it later</a>`; const flashAlert = document.querySelector('.flash-alert'); if (flashAlert) flashAlert.insertAdjacentHTML('beforeend', button); } diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue index ea867d30ce8..89cac42abae 100644 --- a/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue +++ b/app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue @@ -215,6 +215,7 @@ export default { :disabled="!canChangeVisibilityLevel" name="project[visibility_level]" class="form-control select-control" + data-qa-selector="project_visibility_dropdown" > <option :value="visibilityOptions.PRIVATE" diff --git a/app/assets/javascripts/pages/search/show/search.js b/app/assets/javascripts/pages/search/show/search.js index 86ec78e1df8..8f6c48ab065 100644 --- a/app/assets/javascripts/pages/search/show/search.js +++ b/app/assets/javascripts/pages/search/show/search.js @@ -30,7 +30,7 @@ export default class Search { data.unshift({ full_name: __('Any'), }); - data.splice(1, 0, 'divider'); + data.splice(1, 0, { type: 'divider' }); return callback(data); }); }, @@ -57,7 +57,7 @@ export default class Search { data.unshift({ name_with_namespace: __('Any'), }); - data.splice(1, 0, 'divider'); + data.splice(1, 0, { type: 'divider' }); return data; }) diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js index 842fb5e5b4f..510a2441924 100644 --- a/app/assets/javascripts/search_autocomplete.js +++ b/app/assets/javascripts/search_autocomplete.js @@ -191,13 +191,14 @@ export class SearchAutocomplete { // Add group header before list each group if (lastCategory !== suggestion.category) { if (!firstCategory) { - data.push('separator'); + data.push({ type: 'separator' }); } if (firstCategory) { firstCategory = false; } data.push({ - header: suggestion.category, + type: 'header', + content: suggestion.category, }); lastCategory = suggestion.category; } @@ -221,7 +222,7 @@ export class SearchAutocomplete { template = s__('SearchAutocomplete|in this group'); } - data.unshift('separator'); + data.unshift({ type: 'separator' }); data.unshift({ icon, text: term, @@ -271,7 +272,8 @@ export class SearchAutocomplete { if (name) { baseItems.push({ - header: `${name}`, + type: 'header', + content: `${name}`, }); } diff --git a/app/assets/javascripts/users_select.js b/app/assets/javascripts/users_select.js index 12c939aa70f..57efde7f027 100644 --- a/app/assets/javascripts/users_select.js +++ b/app/assets/javascripts/users_select.js @@ -333,7 +333,7 @@ function UsersSelect(currentUser, els, options = {}) { } if (showDivider) { - users.splice(showDivider, 0, 'divider'); + users.splice(showDivider, 0, { type: 'divider' }); } if ($dropdown.hasClass('js-multiselect')) { @@ -343,7 +343,8 @@ function UsersSelect(currentUser, els, options = {}) { if ($dropdown.data('dropdownHeader')) { showDivider += 1; users.splice(showDivider, 0, { - header: $dropdown.data('dropdownHeader'), + type: 'header', + content: $dropdown.data('dropdownHeader'), }); } @@ -358,7 +359,7 @@ function UsersSelect(currentUser, els, options = {}) { users.splice(showDivider, 0, selectedUser); }); - users.splice(showDivider + 1, 0, 'divider'); + users.splice(showDivider + 1, 0, { type: 'divider' }); } } } diff --git a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue index 4b5201bbca7..52acd1de666 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/mr_widget_pipeline.vue @@ -95,7 +95,6 @@ export default { }, }; </script> - <template> <div class="ci-widget media js-ci-widget"> <template v-if="!hasPipeline || hasCIError"> @@ -157,6 +156,7 @@ export default { </div> </template> </span> + <linked-pipelines-mini-list v-if="triggered.length" :triggered="triggered" /> </span> </div> diff --git a/app/assets/javascripts/vue_shared/components/gl_countdown.vue b/app/assets/javascripts/vue_shared/components/gl_countdown.vue index c1aace31fb2..4aae3549601 100644 --- a/app/assets/javascripts/vue_shared/components/gl_countdown.vue +++ b/app/assets/javascripts/vue_shared/components/gl_countdown.vue @@ -9,6 +9,7 @@ export default { directives: { GlTooltip: GlTooltipDirective, }, + props: { endDateString: { type: String, diff --git a/app/assets/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker.vue b/app/assets/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker.vue index 4dcc121496c..c1f3d86335a 100644 --- a/app/assets/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker.vue +++ b/app/assets/javascripts/vue_shared/components/sidebar/collapsed_grouped_date_picker.vue @@ -77,12 +77,11 @@ export default { </script> <template> - <div class="block sidebar-grouped-item"> + <div class="block sidebar-grouped-item gl-cursor-pointer" role="button" @click="toggleSidebar"> <collapsed-calendar-icon v-if="showMinDateBlock" :container-class="iconClass" :tooltip-text="tooltipText('min')" - @click="toggleSidebar" > <span class="sidebar-collapsed-value"> <span v-if="showFromText">{{ __('From') }}</span> <span>{{ dateText('min') }}</span> @@ -93,7 +92,6 @@ export default { v-if="maxDate" :container-class="iconClass" :tooltip-text="tooltipText('max')" - @click="toggleSidebar" > <span class="sidebar-collapsed-value"> <span v-if="!minDate">{{ __('Until') }}</span> <span>{{ dateText('max') }}</span> diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb index b742b7e19cf..956e03cef07 100644 --- a/app/controllers/admin/application_controller.rb +++ b/app/controllers/admin/application_controller.rb @@ -8,3 +8,5 @@ class Admin::ApplicationController < ApplicationController layout 'admin' end + +Admin::ApplicationController.prepend_if_ee('EE::Admin::ApplicationController') diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index f2f72bea5b4..dc16ad80980 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -149,3 +149,5 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController render action end end + +Admin::ApplicationSettingsController.prepend_if_ee('EE::Admin::ApplicationSettingsController') diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb index 64b959e2431..c36bbaab23b 100644 --- a/app/controllers/admin/dashboard_controller.rb +++ b/app/controllers/admin/dashboard_controller.rb @@ -14,3 +14,5 @@ class Admin::DashboardController < Admin::ApplicationController end # rubocop: enable CodeReuse/ActiveRecord end + +Admin::DashboardController.prepend_if_ee('EE::Admin::DashboardController') diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb index 32a36da56fe..85a37fcd43e 100644 --- a/app/controllers/admin/groups_controller.rb +++ b/app/controllers/admin/groups_controller.rb @@ -99,3 +99,5 @@ class Admin::GroupsController < Admin::ApplicationController ] end end + +Admin::GroupsController.prepend_if_ee('EE::Admin::GroupsController') diff --git a/app/controllers/admin/health_check_controller.rb b/app/controllers/admin/health_check_controller.rb index 7cd80e8b5e1..7668c799cba 100644 --- a/app/controllers/admin/health_check_controller.rb +++ b/app/controllers/admin/health_check_controller.rb @@ -11,3 +11,5 @@ class Admin::HealthCheckController < Admin::ApplicationController ['standard'] end end + +Admin::HealthCheckController.prepend_if_ee('EE::Admin::HealthCheckController') diff --git a/app/controllers/admin/logs_controller.rb b/app/controllers/admin/logs_controller.rb index 704e727b1da..14245300633 100644 --- a/app/controllers/admin/logs_controller.rb +++ b/app/controllers/admin/logs_controller.rb @@ -20,3 +20,5 @@ class Admin::LogsController < Admin::ApplicationController ] end end + +Admin::LogsController.prepend_if_ee('EE::Admin::LogsController') diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index 70db15916b9..0e8c69eb7d6 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -76,3 +76,5 @@ class Admin::ProjectsController < Admin::ApplicationController @group ||= @project.group end end + +Admin::ProjectsController.prepend_if_ee('EE::Admin::ProjectsController') diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 98883af6286..61d36d1efc2 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -241,3 +241,5 @@ class Admin::UsersController < Admin::ApplicationController Gitlab::AppLogger.info(_("User %{current_user_username} has started impersonating %{username}") % { current_user_username: current_user.username, username: user.username }) end end + +Admin::UsersController.prepend_if_ee('EE::Admin::UsersController') diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2f7ac41781a..9a7859fc687 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -534,3 +534,5 @@ class ApplicationController < ActionController::Base end end end + +ApplicationController.prepend_if_ee('EE::ApplicationController') diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb index 30a567c3bef..06531932b31 100644 --- a/app/controllers/autocomplete_controller.rb +++ b/app/controllers/autocomplete_controller.rb @@ -46,3 +46,5 @@ class AutocompleteController < ApplicationController render json: target_branches.map { |target_branch| { title: target_branch } } end end + +AutocompleteController.prepend_if_ee('EE::AutocompleteController') diff --git a/app/controllers/boards/lists_controller.rb b/app/controllers/boards/lists_controller.rb index 08b4748d7e1..7633e2aedd2 100644 --- a/app/controllers/boards/lists_controller.rb +++ b/app/controllers/boards/lists_controller.rb @@ -87,3 +87,5 @@ module Boards end end end + +Boards::ListsController.prepend_if_ee('EE::Boards::ListsController') diff --git a/app/controllers/clusters/clusters_controller.rb b/app/controllers/clusters/clusters_controller.rb index 97f59da7885..b55061b5dc6 100644 --- a/app/controllers/clusters/clusters_controller.rb +++ b/app/controllers/clusters/clusters_controller.rb @@ -244,3 +244,5 @@ class Clusters::ClustersController < Clusters::BaseController @cluster.applications.each(&:schedule_status_update) end end + +Clusters::ClustersController.prepend_if_ee('EE::Clusters::ClustersController') diff --git a/app/controllers/concerns/boards_actions.rb b/app/controllers/concerns/boards_actions.rb index e4123d87137..a093d0d6e7f 100644 --- a/app/controllers/concerns/boards_actions.rb +++ b/app/controllers/concerns/boards_actions.rb @@ -44,3 +44,5 @@ module BoardsActions serializer.represent(resource, serializer: 'board', include_full_project_path: board.group_board?) end end + +BoardsActions.prepend_if_ee('EE::BoardsActions') diff --git a/app/controllers/concerns/boards_responses.rb b/app/controllers/concerns/boards_responses.rb index 9da2f888ead..d8bc1320db4 100644 --- a/app/controllers/concerns/boards_responses.rb +++ b/app/controllers/concerns/boards_responses.rb @@ -86,3 +86,5 @@ module BoardsResponses BoardSerializer.new end end + +BoardsResponses.prepend_if_ee('EE::BoardsResponses') diff --git a/app/controllers/concerns/cycle_analytics_params.rb b/app/controllers/concerns/cycle_analytics_params.rb index c1ef848e1e7..b970bdc544e 100644 --- a/app/controllers/concerns/cycle_analytics_params.rb +++ b/app/controllers/concerns/cycle_analytics_params.rb @@ -18,3 +18,5 @@ module CycleAnalyticsParams end end end + +CycleAnalyticsParams.prepend_if_ee('EE::CycleAnalyticsParams') diff --git a/app/controllers/concerns/internal_redirect.rb b/app/controllers/concerns/internal_redirect.rb index fa3716502a0..99bbfd56516 100644 --- a/app/controllers/concerns/internal_redirect.rb +++ b/app/controllers/concerns/internal_redirect.rb @@ -45,3 +45,5 @@ module InternalRedirect URI(request.referer).path end end + +InternalRedirect.prepend_if_ee('EE::InternalRedirect') diff --git a/app/controllers/concerns/issuable_actions.rb b/app/controllers/concerns/issuable_actions.rb index e537c11096c..543a27c56d4 100644 --- a/app/controllers/concerns/issuable_actions.rb +++ b/app/controllers/concerns/issuable_actions.rb @@ -260,3 +260,5 @@ module IssuableActions end # rubocop:enable Gitlab/ModuleWithInstanceVariables end + +IssuableActions.prepend_if_ee('EE::IssuableActions') diff --git a/app/controllers/concerns/issuable_collections.rb b/app/controllers/concerns/issuable_collections.rb index 88044cf7557..c9a8de0b290 100644 --- a/app/controllers/concerns/issuable_collections.rb +++ b/app/controllers/concerns/issuable_collections.rb @@ -153,3 +153,5 @@ module IssuableCollections end # rubocop:enable Gitlab/ModuleWithInstanceVariables end + +IssuableCollections.prepend_if_ee('EE::IssuableCollections') diff --git a/app/controllers/concerns/lfs_request.rb b/app/controllers/concerns/lfs_request.rb index bff0715f192..733265f4099 100644 --- a/app/controllers/concerns/lfs_request.rb +++ b/app/controllers/concerns/lfs_request.rb @@ -128,3 +128,5 @@ module LfsRequest false end end + +LfsRequest.prepend_if_ee('EE::LfsRequest') diff --git a/app/controllers/concerns/routable_actions.rb b/app/controllers/concerns/routable_actions.rb index ff9b0332c97..45f9888a040 100644 --- a/app/controllers/concerns/routable_actions.rb +++ b/app/controllers/concerns/routable_actions.rb @@ -55,3 +55,5 @@ module RoutableActions end end end + +RoutableActions.prepend_if_ee('EE::RoutableActions') diff --git a/app/controllers/concerns/service_params.rb b/app/controllers/concerns/service_params.rb index 48451bedcc2..b07ddd6f684 100644 --- a/app/controllers/concerns/service_params.rb +++ b/app/controllers/concerns/service_params.rb @@ -85,3 +85,5 @@ module ServiceParams ALLOWED_PARAMS_CE end end + +ServiceParams.prepend_if_ee('EE::ServiceParams') diff --git a/app/controllers/confirmations_controller.rb b/app/controllers/confirmations_controller.rb index b192189ba3c..21ee76d31b2 100644 --- a/app/controllers/confirmations_controller.rb +++ b/app/controllers/confirmations_controller.rb @@ -31,3 +31,5 @@ class ConfirmationsController < Devise::ConfirmationsController after_sign_in_path_for(resource) end end + +ConfirmationsController.prepend_if_ee('EE::ConfirmationsController') diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb index 1dc89943f7f..6457732dff0 100644 --- a/app/controllers/dashboard/projects_controller.rb +++ b/app/controllers/dashboard/projects_controller.rb @@ -100,3 +100,5 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController Project::SORTING_PREFERENCE_FIELD end end + +Dashboard::ProjectsController.prepend_if_ee('EE::Dashboard::ProjectsController') diff --git a/app/controllers/groups/application_controller.rb b/app/controllers/groups/application_controller.rb index 5f92333c2c3..d03a50f6f77 100644 --- a/app/controllers/groups/application_controller.rb +++ b/app/controllers/groups/application_controller.rb @@ -38,3 +38,5 @@ class Groups::ApplicationController < ApplicationController url_for(safe_params) end end + +Groups::ApplicationController.prepend_if_ee('EE::Groups::ApplicationController') diff --git a/app/controllers/groups/clusters_controller.rb b/app/controllers/groups/clusters_controller.rb index 92602fd8096..2165dee45fb 100644 --- a/app/controllers/groups/clusters_controller.rb +++ b/app/controllers/groups/clusters_controller.rb @@ -18,3 +18,5 @@ class Groups::ClustersController < Clusters::ClustersController @group ||= find_routable!(Group, params[:group_id] || params[:id]) end end + +Groups::ClustersController.prepend_if_ee('EE::Groups::ClustersController') diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb index 557888711ec..1b1416a72d7 100644 --- a/app/controllers/groups/group_members_controller.rb +++ b/app/controllers/groups/group_members_controller.rb @@ -53,3 +53,5 @@ class Groups::GroupMembersController < Groups::ApplicationController # MembershipActions concern alias_method :membershipable, :group end + +Groups::GroupMembersController.prepend_if_ee('EE::Groups::GroupMembersController') diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb index 7ed4384089b..58df6f66d50 100644 --- a/app/controllers/groups/milestones_controller.rb +++ b/app/controllers/groups/milestones_controller.rb @@ -118,3 +118,5 @@ class Groups::MilestonesController < Groups::ApplicationController params.permit(:state, :search_title).merge(group_ids: group.id) end end + +Groups::MilestonesController.prepend_if_ee('EE::Groups::MilestonesController') diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 886d1f99d69..95a7876a055 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -133,7 +133,7 @@ class GroupsController < Groups::ApplicationController protected def render_show_html - render 'groups/show' + render 'groups/show', locals: { trial: params[:trial] } end def render_details_html @@ -229,3 +229,5 @@ class GroupsController < Groups::ApplicationController url_for(safe_params) end end + +GroupsController.prepend_if_ee('EE::GroupsController') diff --git a/app/controllers/ide_controller.rb b/app/controllers/ide_controller.rb index af1e6cc703b..4c9aac9a327 100644 --- a/app/controllers/ide_controller.rb +++ b/app/controllers/ide_controller.rb @@ -7,3 +7,5 @@ class IdeController < ApplicationController Gitlab::UsageDataCounters::WebIdeCounter.increment_views_count end end + +IdeController.prepend_if_ee('EE::IdeController') diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index ebb50fc8b10..1cea0299fb2 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -186,3 +186,5 @@ class Import::GithubController < Import::BaseController {} end end + +Import::GithubController.prepend_if_ee('EE::Import::GithubController') diff --git a/app/controllers/ldap/omniauth_callbacks_controller.rb b/app/controllers/ldap/omniauth_callbacks_controller.rb index 9a5a45939e0..4d8875937eb 100644 --- a/app/controllers/ldap/omniauth_callbacks_controller.rb +++ b/app/controllers/ldap/omniauth_callbacks_controller.rb @@ -31,3 +31,5 @@ class Ldap::OmniauthCallbacksController < OmniauthCallbacksController redirect_to new_user_session_path end end + +Ldap::OmniauthCallbacksController.prepend_if_ee('EE::Ldap::OmniauthCallbacksController') diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb index b1efa767154..da92df89aed 100644 --- a/app/controllers/omniauth_callbacks_controller.rb +++ b/app/controllers/omniauth_callbacks_controller.rb @@ -214,3 +214,5 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController end end end + +OmniauthCallbacksController.prepend_if_ee('EE::OmniauthCallbacksController') diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb index 77de5cb45c9..af860297358 100644 --- a/app/controllers/passwords_controller.rb +++ b/app/controllers/passwords_controller.rb @@ -64,3 +64,5 @@ class PasswordsController < Devise::PasswordsController notice: I18n.t('devise.passwords.send_paranoid_instructions') end end + +PasswordsController.prepend_if_ee('EE::PasswordsController') diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb index b03f4b7435f..95e055a44db 100644 --- a/app/controllers/profiles/accounts_controller.rb +++ b/app/controllers/profiles/accounts_controller.rb @@ -30,3 +30,5 @@ class Profiles::AccountsController < Profiles::ApplicationController {} end end + +Profiles::AccountsController.prepend_if_ee('EE::Profiles::AccountsController') diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb index 62f98d9e549..046ae5d9a51 100644 --- a/app/controllers/profiles/preferences_controller.rb +++ b/app/controllers/profiles/preferences_controller.rb @@ -50,3 +50,5 @@ class Profiles::PreferencesController < Profiles::ApplicationController ] end end + +Profiles::PreferencesController.prepend_if_ee('::EE::Profiles::PreferencesController') diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb index 0e3f13045ce..605d70d440b 100644 --- a/app/controllers/projects/autocomplete_sources_controller.rb +++ b/app/controllers/projects/autocomplete_sources_controller.rb @@ -43,3 +43,5 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController .execute(params[:type], params[:type_id]) end end + +Projects::AutocompleteSourcesController.prepend_if_ee('EE::Projects::AutocompleteSourcesController') diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 5a1f93dc609..7f776b8b497 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -260,3 +260,5 @@ class Projects::EnvironmentsController < Projects::ApplicationController access_denied! unless can?(current_user, :stop_environment, environment) end end + +Projects::EnvironmentsController.prepend_if_ee('EE::Projects::EnvironmentsController') diff --git a/app/controllers/projects/git_http_client_controller.rb b/app/controllers/projects/git_http_client_controller.rb index abf8407a51c..a597cc9af32 100644 --- a/app/controllers/projects/git_http_client_controller.rb +++ b/app/controllers/projects/git_http_client_controller.rb @@ -119,3 +119,5 @@ class Projects::GitHttpClientController < Projects::ApplicationController Gitlab::ProtocolAccess.allowed?('http') end end + +Projects::GitHttpClientController.prepend_if_ee('EE::Projects::GitHttpClientController') diff --git a/app/controllers/projects/git_http_controller.rb b/app/controllers/projects/git_http_controller.rb index e519cc1f158..0c8c03cb16a 100644 --- a/app/controllers/projects/git_http_controller.rb +++ b/app/controllers/projects/git_http_controller.rb @@ -110,3 +110,5 @@ class Projects::GitHttpController < Projects::GitHttpClientController Users::ActivityService.new(user, 'pull').execute end end + +Projects::GitHttpController.prepend_if_ee('EE::Projects::GitHttpController') diff --git a/app/controllers/projects/group_links_controller.rb b/app/controllers/projects/group_links_controller.rb index dc65f9959db..d06e24ef39c 100644 --- a/app/controllers/projects/group_links_controller.rb +++ b/app/controllers/projects/group_links_controller.rb @@ -53,3 +53,5 @@ class Projects::GroupLinksController < Projects::ApplicationController params.permit(:link_group_access, :expires_at) end end + +Projects::GroupLinksController.prepend_if_ee('EE::Projects::GroupLinksController') diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb index da32ab9e2e0..67a7daf8445 100644 --- a/app/controllers/projects/imports_controller.rb +++ b/app/controllers/projects/imports_controller.rb @@ -73,3 +73,5 @@ class Projects::ImportsController < Projects::ApplicationController .merge(import_url_params) end end + +Projects::ImportsController.prepend_if_ee('EE::Projects::ImportsController') diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index b7fd286bfe0..9cdd6288000 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -280,3 +280,5 @@ class Projects::IssuesController < Projects::ApplicationController Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42422') end end + +Projects::IssuesController.prepend_if_ee('EE::Projects::IssuesController') diff --git a/app/controllers/projects/jobs_controller.rb b/app/controllers/projects/jobs_controller.rb index 06d7579aff4..c83d4e307a7 100644 --- a/app/controllers/projects/jobs_controller.rb +++ b/app/controllers/projects/jobs_controller.rb @@ -231,3 +231,5 @@ class Projects::JobsController < Projects::ApplicationController 'attachment' end end + +Projects::JobsController.prepend_if_ee('EE::Projects::JobsController') diff --git a/app/controllers/projects/lfs_api_controller.rb b/app/controllers/projects/lfs_api_controller.rb index c16736a756a..739f7a2437e 100644 --- a/app/controllers/projects/lfs_api_controller.rb +++ b/app/controllers/projects/lfs_api_controller.rb @@ -123,3 +123,5 @@ class Projects::LfsApiController < Projects::GitHttpClientController _('You cannot write to this read-only GitLab instance.') end end + +Projects::LfsApiController.prepend_if_ee('EE::Projects::LfsApiController') diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb index 006731c0e66..edffeb32203 100644 --- a/app/controllers/projects/merge_requests/application_controller.rb +++ b/app/controllers/projects/merge_requests/application_controller.rb @@ -59,3 +59,5 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont @merge_request.close end end + +Projects::MergeRequests::ApplicationController.prepend_if_ee('EE::Projects::MergeRequests::ApplicationController') diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb index 456d2c34768..9c5caf7719e 100644 --- a/app/controllers/projects/merge_requests/diffs_controller.rb +++ b/app/controllers/projects/merge_requests/diffs_controller.rb @@ -117,3 +117,5 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic @notes end end + +Projects::MergeRequests::DiffsController.prepend_if_ee('EE::Projects::MergeRequests::DiffsController') diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index ea1dd7d19d5..2a58cfb8f6b 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -351,3 +351,5 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo return render_404 unless can?(current_user, :read_build, merge_request.actual_head_pipeline) end end + +Projects::MergeRequestsController.prepend_if_ee('EE::Projects::MergeRequestsController') diff --git a/app/controllers/projects/mirrors_controller.rb b/app/controllers/projects/mirrors_controller.rb index 6c6adc233b7..dd1ea151de7 100644 --- a/app/controllers/projects/mirrors_controller.rb +++ b/app/controllers/projects/mirrors_controller.rb @@ -90,3 +90,5 @@ class Projects::MirrorsController < Projects::ApplicationController params.require(:project).permit(mirror_params_attributes) end end + +Projects::MirrorsController.prepend_if_ee('EE::Projects::MirrorsController') diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 499d4918899..28c25dbc1e6 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -220,3 +220,5 @@ class Projects::PipelinesController < Projects::ApplicationController view_context.limited_counter_with_delimiter(finder.execute) end end + +Projects::PipelinesController.prepend_if_ee('EE::Projects::PipelinesController') diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb index 8938cfbad54..b01d48ca3d3 100644 --- a/app/controllers/projects/project_members_controller.rb +++ b/app/controllers/projects/project_members_controller.rb @@ -51,3 +51,5 @@ class Projects::ProjectMembersController < Projects::ApplicationController # MembershipActions concern alias_method :membershipable, :project end + +Projects::ProjectMembersController.prepend_if_ee('EE::Projects::ProjectMembersController') diff --git a/app/controllers/projects/prometheus/metrics_controller.rb b/app/controllers/projects/prometheus/metrics_controller.rb index 3a9f9aab4a5..267dca74f96 100644 --- a/app/controllers/projects/prometheus/metrics_controller.rb +++ b/app/controllers/projects/prometheus/metrics_controller.rb @@ -32,3 +32,5 @@ module Projects end end end + +Projects::Prometheus::MetricsController.prepend_if_ee('EE::Projects::Prometheus::MetricsController') diff --git a/app/controllers/projects/protected_refs_controller.rb b/app/controllers/projects/protected_refs_controller.rb index 4e2a9df5576..d9921757502 100644 --- a/app/controllers/projects/protected_refs_controller.rb +++ b/app/controllers/projects/protected_refs_controller.rb @@ -65,3 +65,5 @@ class Projects::ProtectedRefsController < Projects::ApplicationController %i[access_level id] end end + +Projects::ProtectedRefsController.prepend_if_ee('EE::Projects::ProtectedRefsController') diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index d69f9e65874..2ed29b937ad 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -90,3 +90,5 @@ class Projects::RepositoriesController < Projects::ApplicationController render_404 end end + +Projects::RepositoriesController.prepend_if_ee('EE::Projects::RepositoriesController') diff --git a/app/controllers/projects/settings/ci_cd_controller.rb b/app/controllers/projects/settings/ci_cd_controller.rb index 1b8d479209b..0d61c3cc031 100644 --- a/app/controllers/projects/settings/ci_cd_controller.rb +++ b/app/controllers/projects/settings/ci_cd_controller.rb @@ -122,3 +122,5 @@ module Projects end end end + +Projects::Settings::CiCdController.prepend_if_ee('EE::Projects::Settings::CiCdController') diff --git a/app/controllers/projects/settings/integrations_controller.rb b/app/controllers/projects/settings/integrations_controller.rb index 388fcb32c35..0c5cf01d912 100644 --- a/app/controllers/projects/settings/integrations_controller.rb +++ b/app/controllers/projects/settings/integrations_controller.rb @@ -25,3 +25,5 @@ module Projects end end end + +Projects::Settings::IntegrationsController.prepend_if_ee('EE::Projects::Settings::IntegrationsController') diff --git a/app/controllers/projects/settings/operations_controller.rb b/app/controllers/projects/settings/operations_controller.rb index ec89bb89edc..7c71486a765 100644 --- a/app/controllers/projects/settings/operations_controller.rb +++ b/app/controllers/projects/settings/operations_controller.rb @@ -69,3 +69,5 @@ module Projects end end end + +Projects::Settings::OperationsController.prepend_if_ee('::EE::Projects::Settings::OperationsController') diff --git a/app/controllers/projects/settings/repository_controller.rb b/app/controllers/projects/settings/repository_controller.rb index bc2ce15286f..0c634bbea03 100644 --- a/app/controllers/projects/settings/repository_controller.rb +++ b/app/controllers/projects/settings/repository_controller.rb @@ -104,3 +104,5 @@ module Projects end end end + +Projects::Settings::RepositoryController.prepend_if_ee('EE::Projects::Settings::RepositoryController') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 5f335de4d6b..a6ed783b433 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -464,3 +464,5 @@ class ProjectsController < Projects::ApplicationController @project = @project.present(current_user: current_user) end end + +ProjectsController.prepend_if_ee('EE::ProjectsController') diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index fb631f09f10..a973ed23da9 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -145,3 +145,5 @@ class RegistrationsController < Devise::RegistrationsController stored_location_for(user) || dashboard_projects_path end end + +RegistrationsController.prepend_if_ee('EE::RegistrationsController') diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index f1b39125a48..310ae17abbf 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -62,3 +62,5 @@ class RootController < Dashboard::ProjectsController root_urls.exclude?(home_page_url) end end + +RootController.prepend_if_ee('EE::RootController') diff --git a/app/controllers/sent_notifications_controller.rb b/app/controllers/sent_notifications_controller.rb index 77757c4a3ef..51a67cd2e3b 100644 --- a/app/controllers/sent_notifications_controller.rb +++ b/app/controllers/sent_notifications_controller.rb @@ -36,3 +36,5 @@ class SentNotificationsController < ApplicationController end end end + +SentNotificationsController.prepend_if_ee('EE::SentNotificationsController') diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index a6dd811ab8b..f8da152e3d2 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -288,3 +288,5 @@ class SessionsController < Devise::SessionsController end end end + +SessionsController.prepend_if_ee('EE::SessionsController') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index e38d4073de3..c3c227b08c5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -182,3 +182,5 @@ class UsersController < ApplicationController access_denied! unless can?(current_user, :read_user_profile, user) end end + +UsersController.prepend_if_ee('EE::UsersController') diff --git a/app/finders/autocomplete/users_finder.rb b/app/finders/autocomplete/users_finder.rb index ce7d0b8699c..8dc3c2320ed 100644 --- a/app/finders/autocomplete/users_finder.rb +++ b/app/finders/autocomplete/users_finder.rb @@ -93,3 +93,5 @@ module Autocomplete end end end + +Autocomplete::UsersFinder.prepend_if_ee('EE::Autocomplete::UsersFinder') diff --git a/app/finders/group_members_finder.rb b/app/finders/group_members_finder.rb index 33ec6a715f9..165d9adae31 100644 --- a/app/finders/group_members_finder.rb +++ b/app/finders/group_members_finder.rb @@ -34,3 +34,5 @@ class GroupMembersFinder < UnionFinder end # rubocop: enable CodeReuse/ActiveRecord end + +GroupMembersFinder.prepend_if_ee('EE::GroupMembersFinder') diff --git a/app/finders/group_projects_finder.rb b/app/finders/group_projects_finder.rb index 5e0dbbfca2e..8ab5072fdc6 100644 --- a/app/finders/group_projects_finder.rb +++ b/app/finders/group_projects_finder.rb @@ -100,3 +100,5 @@ class GroupProjectsFinder < ProjectsFinder group.shared_projects end end + +GroupProjectsFinder.prepend_if_ee('EE::GroupProjectsFinder') diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb index 58a01d598ba..74e89a1e66c 100644 --- a/app/finders/issues_finder.rb +++ b/app/finders/issues_finder.rb @@ -145,3 +145,5 @@ class IssuesFinder < IssuableFinder current_user.blank? end end + +IssuesFinder.prepend_if_ee('EE::IssuesFinder') diff --git a/app/finders/license_template_finder.rb b/app/finders/license_template_finder.rb index d735a4c1d69..1db175e1308 100644 --- a/app/finders/license_template_finder.rb +++ b/app/finders/license_template_finder.rb @@ -13,6 +13,8 @@ class LicenseTemplateFinder include Gitlab::Utils::StrongMemoize + prepend_if_ee('::EE::LicenseTemplateFinder') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :project, :params def initialize(project, params = {}) diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb index 29947bc94d5..1c9c7ec68d0 100644 --- a/app/finders/merge_requests_finder.rb +++ b/app/finders/merge_requests_finder.rb @@ -101,3 +101,5 @@ class MergeRequestsFinder < IssuableFinder .or(table[:title].matches('[WIP]%')) end end + +MergeRequestsFinder.prepend_if_ee('EE::MergeRequestsFinder') diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index f7d9100bb78..e798db561bf 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -171,3 +171,5 @@ class NotesFinder @params[:notes_filter].present? end end + +NotesFinder.prepend_if_ee('EE::NotesFinder') diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb index 23b731b1aed..df06e68c941 100644 --- a/app/finders/projects_finder.rb +++ b/app/finders/projects_finder.rb @@ -24,6 +24,8 @@ class ProjectsFinder < UnionFinder include CustomAttributesFilter + prepend_if_ee('::EE::ProjectsFinder') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_accessor :params attr_reader :current_user, :project_ids_relation diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb index 3e483716064..dfea3d427c2 100644 --- a/app/finders/template_finder.rb +++ b/app/finders/template_finder.rb @@ -3,6 +3,8 @@ class TemplateFinder include Gitlab::Utils::StrongMemoize + prepend_if_ee('::EE::TemplateFinder') # rubocop: disable Cop/InjectEnterpriseEditionModule + VENDORED_TEMPLATES = HashWithIndifferentAccess.new( dockerfiles: ::Gitlab::Template::DockerfileTemplate, gitignores: ::Gitlab::Template::GitignoreTemplate, diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb index 81ae50c0bd1..d5650c6828d 100644 --- a/app/finders/users_finder.rb +++ b/app/finders/users_finder.rb @@ -95,3 +95,5 @@ class UsersFinder end end end + +UsersFinder.prepend_if_ee('EE::UsersFinder') diff --git a/app/graphql/resolvers/echo_resolver.rb b/app/graphql/resolvers/echo_resolver.rb index 8076e1784ce..2ce55544254 100644 --- a/app/graphql/resolvers/echo_resolver.rb +++ b/app/graphql/resolvers/echo_resolver.rb @@ -2,7 +2,7 @@ module Resolvers class EchoResolver < BaseResolver - argument :text, GraphQL::STRING_TYPE, required: true + argument :text, GraphQL::STRING_TYPE, required: true # rubocop:disable Graphql/Descriptions description 'Testing endpoint to validate the API with' def resolve(**args) diff --git a/app/graphql/resolvers/issues_resolver.rb b/app/graphql/resolvers/issues_resolver.rb index dd104e83f43..b50186c5a82 100644 --- a/app/graphql/resolvers/issues_resolver.rb +++ b/app/graphql/resolvers/issues_resolver.rb @@ -33,9 +33,9 @@ module Resolvers argument :closed_after, Types::TimeType, required: false, description: "Issues closed after this date" - argument :search, GraphQL::STRING_TYPE, + argument :search, GraphQL::STRING_TYPE, # rubocop:disable Graphql/Descriptions required: false - argument :sort, Types::Sort, + argument :sort, Types::Sort, # rubocop:disable Graphql/Descriptions required: false, default_value: 'created_desc' diff --git a/app/graphql/types/ci/detailed_status_type.rb b/app/graphql/types/ci/detailed_status_type.rb index 5f7d7a934ce..d2847641d91 100644 --- a/app/graphql/types/ci/detailed_status_type.rb +++ b/app/graphql/types/ci/detailed_status_type.rb @@ -6,14 +6,14 @@ module Types class DetailedStatusType < BaseObject graphql_name 'DetailedStatus' - field :group, GraphQL::STRING_TYPE, null: false - field :icon, GraphQL::STRING_TYPE, null: false - field :favicon, GraphQL::STRING_TYPE, null: false - field :details_path, GraphQL::STRING_TYPE, null: false - field :has_details, GraphQL::BOOLEAN_TYPE, null: false, method: :has_details? - field :label, GraphQL::STRING_TYPE, null: false - field :text, GraphQL::STRING_TYPE, null: false - field :tooltip, GraphQL::STRING_TYPE, null: false, method: :status_tooltip + field :group, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :icon, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :favicon, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :details_path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :has_details, GraphQL::BOOLEAN_TYPE, null: false, method: :has_details? # rubocop:disable Graphql/Descriptions + field :label, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :text, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :tooltip, GraphQL::STRING_TYPE, null: false, method: :status_tooltip # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/ci/pipeline_type.rb b/app/graphql/types/ci/pipeline_type.rb index cff81e5670b..dfcfd6211bc 100644 --- a/app/graphql/types/ci/pipeline_type.rb +++ b/app/graphql/types/ci/pipeline_type.rb @@ -9,13 +9,13 @@ module Types expose_permissions Types::PermissionTypes::Ci::Pipeline - field :id, GraphQL::ID_TYPE, null: false - field :iid, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :iid, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :sha, GraphQL::STRING_TYPE, null: false - field :before_sha, GraphQL::STRING_TYPE, null: true - field :status, PipelineStatusEnum, null: false - field :detailed_status, + field :sha, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :before_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :status, PipelineStatusEnum, null: false # rubocop:disable Graphql/Descriptions + field :detailed_status, # rubocop:disable Graphql/Descriptions Types::Ci::DetailedStatusType, null: false, resolve: -> (obj, _args, ctx) { obj.detailed_status(ctx[:current_user]) } @@ -27,11 +27,11 @@ module Types GraphQL::FLOAT_TYPE, null: true, description: "Coverage percentage" - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false - field :started_at, Types::TimeType, null: true - field :finished_at, Types::TimeType, null: true - field :committed_at, Types::TimeType, null: true + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :started_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :finished_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :committed_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions # TODO: Add triggering user as a type end diff --git a/app/graphql/types/commit_type.rb b/app/graphql/types/commit_type.rb index d73dd73affd..dd2d81adb8b 100644 --- a/app/graphql/types/commit_type.rb +++ b/app/graphql/types/commit_type.rb @@ -8,16 +8,16 @@ module Types present_using CommitPresenter - field :id, type: GraphQL::ID_TYPE, null: false - field :sha, type: GraphQL::STRING_TYPE, null: false - field :title, type: GraphQL::STRING_TYPE, null: true - field :description, type: GraphQL::STRING_TYPE, null: true - field :message, type: GraphQL::STRING_TYPE, null: true - field :authored_date, type: Types::TimeType, null: true - field :web_url, type: GraphQL::STRING_TYPE, null: false + field :id, type: GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :sha, type: GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :description, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :message, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :authored_date, type: Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :web_url, type: GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions # models/commit lazy loads the author by email - field :author, type: Types::UserType, null: true + field :author, type: Types::UserType, null: true # rubocop:disable Graphql/Descriptions field :latest_pipeline, type: Types::Ci::PipelineType, diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb index 66b41919914..1e52c0cb147 100644 --- a/app/graphql/types/group_type.rb +++ b/app/graphql/types/group_type.rb @@ -8,14 +8,16 @@ module Types expose_permissions Types::PermissionTypes::Group - field :web_url, GraphQL::STRING_TYPE, null: false + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :avatar_url, GraphQL::STRING_TYPE, null: true, resolve: -> (group, args, ctx) do + field :avatar_url, GraphQL::STRING_TYPE, null: true, resolve: -> (group, args, ctx) do # rubocop:disable Graphql/Descriptions group.avatar_url(only_path: false) end - field :parent, GroupType, + field :parent, GroupType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Group, obj.parent_id).find } end end + +Types::GroupType.prepend_if_ee('EE::Types::GroupType') diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb index 8b208cab1df..09e51ae4bc0 100644 --- a/app/graphql/types/issue_type.rb +++ b/app/graphql/types/issue_type.rb @@ -12,48 +12,50 @@ module Types present_using IssuePresenter - field :iid, GraphQL::ID_TYPE, null: false - field :title, GraphQL::STRING_TYPE, null: false + field :iid, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions markdown_field :title_html, null: true - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :state, IssueStateEnum, null: false + field :state, IssueStateEnum, null: false # rubocop:disable Graphql/Descriptions - field :reference, GraphQL::STRING_TYPE, null: false, method: :to_reference do - argument :full, GraphQL::BOOLEAN_TYPE, required: false, default_value: false + field :reference, GraphQL::STRING_TYPE, null: false, method: :to_reference do # rubocop:disable Graphql/Descriptions + argument :full, GraphQL::BOOLEAN_TYPE, required: false, default_value: false # rubocop:disable Graphql/Descriptions end - field :author, Types::UserType, + field :author, Types::UserType, # rubocop:disable Graphql/Descriptions null: false, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(User, obj.author_id).find } # Remove complexity when BatchLoader is used - field :assignees, Types::UserType.connection_type, null: true, complexity: 5 + field :assignees, Types::UserType.connection_type, null: true, complexity: 5 # rubocop:disable Graphql/Descriptions # Remove complexity when BatchLoader is used - field :labels, Types::LabelType.connection_type, null: true, complexity: 5 - field :milestone, Types::MilestoneType, + field :labels, Types::LabelType.connection_type, null: true, complexity: 5 # rubocop:disable Graphql/Descriptions + field :milestone, Types::MilestoneType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Milestone, obj.milestone_id).find } - field :due_date, Types::TimeType, null: true - field :confidential, GraphQL::BOOLEAN_TYPE, null: false - field :discussion_locked, GraphQL::BOOLEAN_TYPE, + field :due_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :confidential, GraphQL::BOOLEAN_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :discussion_locked, GraphQL::BOOLEAN_TYPE, # rubocop:disable Graphql/Descriptions null: false, resolve: -> (obj, _args, _ctx) { !!obj.discussion_locked } - field :upvotes, GraphQL::INT_TYPE, null: false - field :downvotes, GraphQL::INT_TYPE, null: false - field :user_notes_count, GraphQL::INT_TYPE, null: false - field :web_path, GraphQL::STRING_TYPE, null: false, method: :issue_path - field :web_url, GraphQL::STRING_TYPE, null: false - field :relative_position, GraphQL::INT_TYPE, null: true + field :upvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :downvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :user_notes_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :web_path, GraphQL::STRING_TYPE, null: false, method: :issue_path # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :relative_position, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :closed_at, Types::TimeType, null: true + field :closed_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions - field :task_completion_status, Types::TaskCompletionStatus, null: false + field :task_completion_status, Types::TaskCompletionStatus, null: false # rubocop:disable Graphql/Descriptions end end + +Types::IssueType.prepend_if_ee('::EE::Types::IssueType') diff --git a/app/graphql/types/label_type.rb b/app/graphql/types/label_type.rb index 3aeda2e7953..384a27df563 100644 --- a/app/graphql/types/label_type.rb +++ b/app/graphql/types/label_type.rb @@ -6,10 +6,10 @@ module Types authorize :read_label - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :title, GraphQL::STRING_TYPE, null: false - field :color, GraphQL::STRING_TYPE, null: false - field :text_color, GraphQL::STRING_TYPE, null: false + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :color, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :text_color, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb index b8f63a750c5..1baaa33c819 100644 --- a/app/graphql/types/merge_request_type.rb +++ b/app/graphql/types/merge_request_type.rb @@ -12,53 +12,55 @@ module Types present_using MergeRequestPresenter - field :id, GraphQL::ID_TYPE, null: false - field :iid, GraphQL::STRING_TYPE, null: false - field :title, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :iid, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions markdown_field :title_html, null: true - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :state, MergeRequestStateEnum, null: false - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false - field :source_project, Types::ProjectType, null: true - field :target_project, Types::ProjectType, null: false - field :diff_refs, Types::DiffRefsType, null: true + field :state, MergeRequestStateEnum, null: false # rubocop:disable Graphql/Descriptions + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :source_project, Types::ProjectType, null: true # rubocop:disable Graphql/Descriptions + field :target_project, Types::ProjectType, null: false # rubocop:disable Graphql/Descriptions + field :diff_refs, Types::DiffRefsType, null: true # rubocop:disable Graphql/Descriptions # Alias for target_project - field :project, Types::ProjectType, null: false - field :project_id, GraphQL::INT_TYPE, null: false, method: :target_project_id - field :source_project_id, GraphQL::INT_TYPE, null: true - field :target_project_id, GraphQL::INT_TYPE, null: false - field :source_branch, GraphQL::STRING_TYPE, null: false - field :target_branch, GraphQL::STRING_TYPE, null: false - field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false - field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true - field :diff_head_sha, GraphQL::STRING_TYPE, null: true - field :merge_commit_sha, GraphQL::STRING_TYPE, null: true - field :user_notes_count, GraphQL::INT_TYPE, null: true - field :should_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :should_remove_source_branch?, null: true - field :force_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :force_remove_source_branch?, null: true - field :merge_status, GraphQL::STRING_TYPE, null: true - field :in_progress_merge_commit_sha, GraphQL::STRING_TYPE, null: true - field :merge_error, GraphQL::STRING_TYPE, null: true - field :allow_collaboration, GraphQL::BOOLEAN_TYPE, null: true - field :should_be_rebased, GraphQL::BOOLEAN_TYPE, method: :should_be_rebased?, null: false - field :rebase_commit_sha, GraphQL::STRING_TYPE, null: true - field :rebase_in_progress, GraphQL::BOOLEAN_TYPE, method: :rebase_in_progress?, null: false, calls_gitaly: true + field :project, Types::ProjectType, null: false # rubocop:disable Graphql/Descriptions + field :project_id, GraphQL::INT_TYPE, null: false, method: :target_project_id # rubocop:disable Graphql/Descriptions + field :source_project_id, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :target_project_id, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :source_branch, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :target_branch, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :work_in_progress, GraphQL::BOOLEAN_TYPE, method: :work_in_progress?, null: false # rubocop:disable Graphql/Descriptions + field :merge_when_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :diff_head_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :user_notes_count, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :should_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :should_remove_source_branch?, null: true # rubocop:disable Graphql/Descriptions + field :force_remove_source_branch, GraphQL::BOOLEAN_TYPE, method: :force_remove_source_branch?, null: true # rubocop:disable Graphql/Descriptions + field :merge_status, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :in_progress_merge_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_error, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :allow_collaboration, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :should_be_rebased, GraphQL::BOOLEAN_TYPE, method: :should_be_rebased?, null: false # rubocop:disable Graphql/Descriptions + field :rebase_commit_sha, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :rebase_in_progress, GraphQL::BOOLEAN_TYPE, method: :rebase_in_progress?, null: false, calls_gitaly: true # rubocop:disable Graphql/Descriptions + # rubocop:disable Graphql/Descriptions field :merge_commit_message, GraphQL::STRING_TYPE, method: :default_merge_commit_message, null: true, deprecation_reason: "Renamed to defaultMergeCommitMessage" - field :default_merge_commit_message, GraphQL::STRING_TYPE, null: true - field :merge_ongoing, GraphQL::BOOLEAN_TYPE, method: :merge_ongoing?, null: false - field :source_branch_exists, GraphQL::BOOLEAN_TYPE, method: :source_branch_exists?, null: false - field :mergeable_discussions_state, GraphQL::BOOLEAN_TYPE, null: true - field :web_url, GraphQL::STRING_TYPE, null: true - field :upvotes, GraphQL::INT_TYPE, null: false - field :downvotes, GraphQL::INT_TYPE, null: false - field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false + # rubocop:enable Graphql/Descriptions + field :default_merge_commit_message, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_ongoing, GraphQL::BOOLEAN_TYPE, method: :merge_ongoing?, null: false # rubocop:disable Graphql/Descriptions + field :source_branch_exists, GraphQL::BOOLEAN_TYPE, method: :source_branch_exists?, null: false # rubocop:disable Graphql/Descriptions + field :mergeable_discussions_state, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :upvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :downvotes, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :subscribed, GraphQL::BOOLEAN_TYPE, method: :subscribed?, null: false # rubocop:disable Graphql/Descriptions - field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline - field :pipelines, Types::Ci::PipelineType.connection_type, + field :head_pipeline, Types::Ci::PipelineType, null: true, method: :actual_head_pipeline # rubocop:disable Graphql/Descriptions + field :pipelines, Types::Ci::PipelineType.connection_type, # rubocop:disable Graphql/Descriptions resolver: Resolvers::MergeRequestPipelinesResolver - field :task_completion_status, Types::TaskCompletionStatus, null: false + field :task_completion_status, Types::TaskCompletionStatus, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/metadata_type.rb b/app/graphql/types/metadata_type.rb index 7d7813a7652..bfcb929f5ac 100644 --- a/app/graphql/types/metadata_type.rb +++ b/app/graphql/types/metadata_type.rb @@ -6,7 +6,7 @@ module Types authorize :read_instance_metadata - field :version, GraphQL::STRING_TYPE, null: false - field :revision, GraphQL::STRING_TYPE, null: false + field :version, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :revision, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/milestone_type.rb b/app/graphql/types/milestone_type.rb index 2772fbec86f..78d0a8220ec 100644 --- a/app/graphql/types/milestone_type.rb +++ b/app/graphql/types/milestone_type.rb @@ -6,14 +6,14 @@ module Types authorize :read_milestone - field :description, GraphQL::STRING_TYPE, null: true - field :title, GraphQL::STRING_TYPE, null: false - field :state, GraphQL::STRING_TYPE, null: false + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :title, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :state, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :due_date, Types::TimeType, null: true - field :start_date, Types::TimeType, null: true + field :due_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :start_date, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index f843d6ad86f..17f922a5e54 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -17,3 +17,5 @@ module Types mount_mutation Mutations::Notes::Destroy end end + +::Types::MutationType.prepend_if_ee('::EE::Types::MutationType') diff --git a/app/graphql/types/namespace_type.rb b/app/graphql/types/namespace_type.rb index 35a97b5ace0..cc1d06b19e1 100644 --- a/app/graphql/types/namespace_type.rb +++ b/app/graphql/types/namespace_type.rb @@ -6,25 +6,25 @@ module Types authorize :read_namespace - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :name, GraphQL::STRING_TYPE, null: false - field :path, GraphQL::STRING_TYPE, null: false - field :full_name, GraphQL::STRING_TYPE, null: false - field :full_path, GraphQL::ID_TYPE, null: false + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :full_name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :full_path, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :visibility, GraphQL::STRING_TYPE, null: true - field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true, method: :lfs_enabled? - field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :visibility, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true, method: :lfs_enabled? # rubocop:disable Graphql/Descriptions + field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions field :root_storage_statistics, Types::RootStorageStatisticsType, null: true, description: 'The aggregated storage statistics. Only available for root namespaces', resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchRootStorageStatisticsLoader.new(obj.id).find } - field :projects, + field :projects, # rubocop:disable Graphql/Descriptions Types::ProjectType.connection_type, null: false, resolver: ::Resolvers::NamespaceProjectsResolver diff --git a/app/graphql/types/notes/diff_position_type.rb b/app/graphql/types/notes/diff_position_type.rb index 6a0377fbfdf..cab8c750dc0 100644 --- a/app/graphql/types/notes/diff_position_type.rb +++ b/app/graphql/types/notes/diff_position_type.rb @@ -7,7 +7,7 @@ module Types class DiffPositionType < BaseObject graphql_name 'DiffPosition' - field :diff_refs, Types::DiffRefsType, null: false + field :diff_refs, Types::DiffRefsType, null: false # rubocop:disable Graphql/Descriptions field :file_path, GraphQL::STRING_TYPE, null: false, description: "The path of the file that was changed" @@ -15,7 +15,7 @@ module Types description: "The path of the file on the start sha." field :new_path, GraphQL::STRING_TYPE, null: true, description: "The path of the file on the head sha." - field :position_type, Types::Notes::PositionTypeEnum, null: false + field :position_type, Types::Notes::PositionTypeEnum, null: false # rubocop:disable Graphql/Descriptions # Fields for text positions field :old_line, GraphQL::INT_TYPE, null: true, diff --git a/app/graphql/types/notes/discussion_type.rb b/app/graphql/types/notes/discussion_type.rb index a3fb28298f6..ab87f8280ac 100644 --- a/app/graphql/types/notes/discussion_type.rb +++ b/app/graphql/types/notes/discussion_type.rb @@ -7,9 +7,9 @@ module Types authorize :read_note - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions field :reply_id, GraphQL::ID_TYPE, null: false, description: 'The ID used to reply to this discussion' - field :created_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions field :notes, Types::Notes::NoteType.connection_type, null: false, description: "All notes in the discussion" # The gem we use to generate Global IDs is hard-coded to work with diff --git a/app/graphql/types/notes/note_type.rb b/app/graphql/types/notes/note_type.rb index fe54a45c7dc..4edf6ed90f7 100644 --- a/app/graphql/types/notes/note_type.rb +++ b/app/graphql/types/notes/note_type.rb @@ -9,7 +9,7 @@ module Types expose_permissions Types::PermissionTypes::Note - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions field :project, Types::ProjectType, null: true, @@ -37,10 +37,10 @@ module Types markdown_field :body_html, null: true, method: :note - field :created_at, Types::TimeType, null: false - field :updated_at, Types::TimeType, null: false + field :created_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions + field :updated_at, Types::TimeType, null: false # rubocop:disable Graphql/Descriptions field :discussion, Types::Notes::DiscussionType, null: true, description: "The discussion this note is a part of" - field :resolvable, GraphQL::BOOLEAN_TYPE, null: false, method: :resolvable? + field :resolvable, GraphQL::BOOLEAN_TYPE, null: false, method: :resolvable? # rubocop:disable Graphql/Descriptions field :resolved_at, Types::TimeType, null: true, description: "The time the discussion was resolved" field :position, Types::Notes::DiffPositionType, null: true, description: "The position of this note on a diff" end diff --git a/app/graphql/types/notes/noteable_type.rb b/app/graphql/types/notes/noteable_type.rb index 9f126d67b0d..ab4a170b123 100644 --- a/app/graphql/types/notes/noteable_type.rb +++ b/app/graphql/types/notes/noteable_type.rb @@ -23,3 +23,5 @@ module Types end end end + +Types::Notes::NoteableType.extend_if_ee('::EE::Types::Notes::NoteableType') diff --git a/app/graphql/types/permission_types/base_permission_type.rb b/app/graphql/types/permission_types/base_permission_type.rb index 26a71e2bfbb..73049ebed7b 100644 --- a/app/graphql/types/permission_types/base_permission_type.rb +++ b/app/graphql/types/permission_types/base_permission_type.rb @@ -28,7 +28,7 @@ module Types description: "Whether or not a user can perform `#{name}` on this resource", null: false) - field(**kword_args) + field(**kword_args) # rubocop:disable Graphql/Descriptions end def self.resolving_keywords?(arguments) diff --git a/app/graphql/types/permission_types/issue.rb b/app/graphql/types/permission_types/issue.rb index 199540c7d6d..e26c5950e73 100644 --- a/app/graphql/types/permission_types/issue.rb +++ b/app/graphql/types/permission_types/issue.rb @@ -12,3 +12,5 @@ module Types end end end + +Types::PermissionTypes::Issue.prepend_if_ee('::EE::Types::PermissionTypes::Issue') diff --git a/app/graphql/types/permission_types/project.rb b/app/graphql/types/permission_types/project.rb index 993d33c4fc2..3a6ba371154 100644 --- a/app/graphql/types/permission_types/project.rb +++ b/app/graphql/types/permission_types/project.rb @@ -20,3 +20,5 @@ module Types end end end + +Types::PermissionTypes::Project.prepend_if_ee('EE::Types::PermissionTypes::Project') diff --git a/app/graphql/types/project_statistics_type.rb b/app/graphql/types/project_statistics_type.rb index 4000c6db280..5045471a75b 100644 --- a/app/graphql/types/project_statistics_type.rb +++ b/app/graphql/types/project_statistics_type.rb @@ -6,13 +6,13 @@ module Types authorize :read_statistics - field :commit_count, GraphQL::INT_TYPE, null: false + field :commit_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :storage_size, GraphQL::INT_TYPE, null: false - field :repository_size, GraphQL::INT_TYPE, null: false - field :lfs_objects_size, GraphQL::INT_TYPE, null: false - field :build_artifacts_size, GraphQL::INT_TYPE, null: false - field :packages_size, GraphQL::INT_TYPE, null: false - field :wiki_size, GraphQL::INT_TYPE, null: true + field :storage_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :repository_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :lfs_objects_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :build_artifacts_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :packages_size, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :wiki_size, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/project_type.rb b/app/graphql/types/project_type.rb index 13be71c26ee..7184cf42284 100644 --- a/app/graphql/types/project_type.rb +++ b/app/graphql/types/project_type.rb @@ -8,95 +8,95 @@ module Types expose_permissions Types::PermissionTypes::Project - field :id, GraphQL::ID_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :full_path, GraphQL::ID_TYPE, null: false - field :path, GraphQL::STRING_TYPE, null: false + field :full_path, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :name_with_namespace, GraphQL::STRING_TYPE, null: false - field :name, GraphQL::STRING_TYPE, null: false + field :name_with_namespace, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions - field :description, GraphQL::STRING_TYPE, null: true + field :description, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions markdown_field :description_html, null: true - field :tag_list, GraphQL::STRING_TYPE, null: true + field :tag_list, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :ssh_url_to_repo, GraphQL::STRING_TYPE, null: true - field :http_url_to_repo, GraphQL::STRING_TYPE, null: true - field :web_url, GraphQL::STRING_TYPE, null: true + field :ssh_url_to_repo, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :http_url_to_repo, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :star_count, GraphQL::INT_TYPE, null: false - field :forks_count, GraphQL::INT_TYPE, null: false, calls_gitaly: true # 4 times + field :star_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :forks_count, GraphQL::INT_TYPE, null: false, calls_gitaly: true # 4 times # rubocop:disable Graphql/Descriptions - field :created_at, Types::TimeType, null: true - field :last_activity_at, Types::TimeType, null: true + field :created_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions + field :last_activity_at, Types::TimeType, null: true # rubocop:disable Graphql/Descriptions - field :archived, GraphQL::BOOLEAN_TYPE, null: true + field :archived, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :visibility, GraphQL::STRING_TYPE, null: true + field :visibility, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :container_registry_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :shared_runners_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :merge_requests_ff_only_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :container_registry_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :shared_runners_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :merge_requests_ff_only_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :avatar_url, GraphQL::STRING_TYPE, null: true, calls_gitaly: true, resolve: -> (project, args, ctx) do + field :avatar_url, GraphQL::STRING_TYPE, null: true, calls_gitaly: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.avatar_url(only_path: false) end %i[issues merge_requests wiki snippets].each do |feature| - field "#{feature}_enabled", GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do + field "#{feature}_enabled", GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.feature_available?(feature, ctx[:current_user]) end end - field :jobs_enabled, GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do + field :jobs_enabled, GraphQL::BOOLEAN_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.feature_available?(:builds, ctx[:current_user]) end - field :public_jobs, GraphQL::BOOLEAN_TYPE, method: :public_builds, null: true + field :public_jobs, GraphQL::BOOLEAN_TYPE, method: :public_builds, null: true # rubocop:disable Graphql/Descriptions - field :open_issues_count, GraphQL::INT_TYPE, null: true, resolve: -> (project, args, ctx) do + field :open_issues_count, GraphQL::INT_TYPE, null: true, resolve: -> (project, args, ctx) do # rubocop:disable Graphql/Descriptions project.open_issues_count if project.feature_available?(:issues, ctx[:current_user]) end - field :import_status, GraphQL::STRING_TYPE, null: true + field :import_status, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :only_allow_merge_if_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true - field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true - field :only_allow_merge_if_all_discussions_are_resolved, GraphQL::BOOLEAN_TYPE, null: true - field :printing_merge_request_link_enabled, GraphQL::BOOLEAN_TYPE, null: true + field :only_allow_merge_if_pipeline_succeeds, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :request_access_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :only_allow_merge_if_all_discussions_are_resolved, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :printing_merge_request_link_enabled, GraphQL::BOOLEAN_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :namespace, Types::NamespaceType, null: true - field :group, Types::GroupType, null: true + field :namespace, Types::NamespaceType, null: true # rubocop:disable Graphql/Descriptions + field :group, Types::GroupType, null: true # rubocop:disable Graphql/Descriptions - field :statistics, Types::ProjectStatisticsType, + field :statistics, Types::ProjectStatisticsType, # rubocop:disable Graphql/Descriptions null: true, resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchProjectStatisticsLoader.new(obj.id).find } - field :repository, Types::RepositoryType, null: true + field :repository, Types::RepositoryType, null: true # rubocop:disable Graphql/Descriptions - field :merge_requests, + field :merge_requests, # rubocop:disable Graphql/Descriptions Types::MergeRequestType.connection_type, null: true, resolver: Resolvers::MergeRequestsResolver - field :merge_request, + field :merge_request, # rubocop:disable Graphql/Descriptions Types::MergeRequestType, null: true, resolver: Resolvers::MergeRequestsResolver.single - field :issues, + field :issues, # rubocop:disable Graphql/Descriptions Types::IssueType.connection_type, null: true, resolver: Resolvers::IssuesResolver - field :issue, + field :issue, # rubocop:disable Graphql/Descriptions Types::IssueType, null: true, resolver: Resolvers::IssuesResolver.single - field :pipelines, + field :pipelines, # rubocop:disable Graphql/Descriptions Types::Ci::PipelineType.connection_type, null: true, resolver: Resolvers::ProjectPipelinesResolver diff --git a/app/graphql/types/query_type.rb b/app/graphql/types/query_type.rb index c686300b25d..bbf94fb92df 100644 --- a/app/graphql/types/query_type.rb +++ b/app/graphql/types/query_type.rb @@ -24,6 +24,6 @@ module Types resolver: Resolvers::MetadataResolver, description: 'Metadata about GitLab' - field :echo, GraphQL::STRING_TYPE, null: false, resolver: Resolvers::EchoResolver + field :echo, GraphQL::STRING_TYPE, null: false, resolver: Resolvers::EchoResolver # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/repository_type.rb b/app/graphql/types/repository_type.rb index b024eca61fc..9ecd336b41d 100644 --- a/app/graphql/types/repository_type.rb +++ b/app/graphql/types/repository_type.rb @@ -6,9 +6,9 @@ module Types authorize :download_code - field :root_ref, GraphQL::STRING_TYPE, null: true, calls_gitaly: true - field :empty, GraphQL::BOOLEAN_TYPE, null: false, method: :empty?, calls_gitaly: true - field :exists, GraphQL::BOOLEAN_TYPE, null: false, method: :exists? - field :tree, Types::Tree::TreeType, null: true, resolver: Resolvers::TreeResolver, calls_gitaly: true + field :root_ref, GraphQL::STRING_TYPE, null: true, calls_gitaly: true # rubocop:disable Graphql/Descriptions + field :empty, GraphQL::BOOLEAN_TYPE, null: false, method: :empty?, calls_gitaly: true # rubocop:disable Graphql/Descriptions + field :exists, GraphQL::BOOLEAN_TYPE, null: false, method: :exists? # rubocop:disable Graphql/Descriptions + field :tree, Types::Tree::TreeType, null: true, resolver: Resolvers::TreeResolver, calls_gitaly: true # rubocop:disable Graphql/Descriptions end end diff --git a/app/graphql/types/task_completion_status.rb b/app/graphql/types/task_completion_status.rb index ac128481ac4..0aa8fc60a7c 100644 --- a/app/graphql/types/task_completion_status.rb +++ b/app/graphql/types/task_completion_status.rb @@ -8,8 +8,8 @@ module Types graphql_name 'TaskCompletionStatus' description 'Completion status of tasks' - field :count, GraphQL::INT_TYPE, null: false - field :completed_count, GraphQL::INT_TYPE, null: false + field :count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :completed_count, GraphQL::INT_TYPE, null: false # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/blob_type.rb b/app/graphql/types/tree/blob_type.rb index 9497e378dc0..0886a0ba98e 100644 --- a/app/graphql/types/tree/blob_type.rb +++ b/app/graphql/types/tree/blob_type.rb @@ -10,8 +10,8 @@ module Types graphql_name 'Blob' - field :web_url, GraphQL::STRING_TYPE, null: true - field :lfs_oid, GraphQL::STRING_TYPE, null: true, resolve: -> (blob, args, ctx) do + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :lfs_oid, GraphQL::STRING_TYPE, null: true, resolve: -> (blob, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Loaders::BatchLfsOidLoader.new(blob.repository, blob.id).find end # rubocop: enable Graphql/AuthorizeTypes diff --git a/app/graphql/types/tree/entry_type.rb b/app/graphql/types/tree/entry_type.rb index d8e8642ddb8..10c2ad8815e 100644 --- a/app/graphql/types/tree/entry_type.rb +++ b/app/graphql/types/tree/entry_type.rb @@ -4,11 +4,11 @@ module Types module EntryType include Types::BaseInterface - field :id, GraphQL::ID_TYPE, null: false - field :name, GraphQL::STRING_TYPE, null: false - field :type, Tree::TypeEnum, null: false - field :path, GraphQL::STRING_TYPE, null: false - field :flat_path, GraphQL::STRING_TYPE, null: false + field :id, GraphQL::ID_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :type, Tree::TypeEnum, null: false # rubocop:disable Graphql/Descriptions + field :path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :flat_path, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end end diff --git a/app/graphql/types/tree/submodule_type.rb b/app/graphql/types/tree/submodule_type.rb index 2b47e5c0161..d8e2ab4dd68 100644 --- a/app/graphql/types/tree/submodule_type.rb +++ b/app/graphql/types/tree/submodule_type.rb @@ -8,8 +8,8 @@ module Types graphql_name 'Submodule' - field :web_url, type: GraphQL::STRING_TYPE, null: true - field :tree_url, type: GraphQL::STRING_TYPE, null: true + field :web_url, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions + field :tree_url, type: GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/tree_entry_type.rb b/app/graphql/types/tree/tree_entry_type.rb index d7faa633706..904c7dfb795 100644 --- a/app/graphql/types/tree/tree_entry_type.rb +++ b/app/graphql/types/tree/tree_entry_type.rb @@ -11,7 +11,7 @@ module Types graphql_name 'TreeEntry' description 'Represents a directory' - field :web_url, GraphQL::STRING_TYPE, null: true + field :web_url, GraphQL::STRING_TYPE, null: true # rubocop:disable Graphql/Descriptions end # rubocop: enable Graphql/AuthorizeTypes end diff --git a/app/graphql/types/tree/tree_type.rb b/app/graphql/types/tree/tree_type.rb index 99f2a6c0235..b967cf3a247 100644 --- a/app/graphql/types/tree/tree_type.rb +++ b/app/graphql/types/tree/tree_type.rb @@ -7,19 +7,21 @@ module Types graphql_name 'Tree' # Complexity 10 as it triggers a Gitaly call on each render - field :last_commit, Types::CommitType, null: true, complexity: 10, calls_gitaly: true, resolve: -> (tree, args, ctx) do + field :last_commit, Types::CommitType, null: true, complexity: 10, calls_gitaly: true, resolve: -> (tree, args, ctx) do # rubocop:disable Graphql/Descriptions tree.repository.last_commit_for_path(tree.sha, tree.path) end - field :trees, Types::Tree::TreeEntryType.connection_type, null: false, resolve: -> (obj, args, ctx) do + field :trees, Types::Tree::TreeEntryType.connection_type, null: false, resolve: -> (obj, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Representation::TreeEntry.decorate(obj.trees, obj.repository) end + # rubocop:disable Graphql/Descriptions field :submodules, Types::Tree::SubmoduleType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do Gitlab::Graphql::Representation::SubmoduleTreeEntry.decorate(obj.submodules, obj) end + # rubocop:enable Graphql/Descriptions - field :blobs, Types::Tree::BlobType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do + field :blobs, Types::Tree::BlobType.connection_type, null: false, calls_gitaly: true, resolve: -> (obj, args, ctx) do # rubocop:disable Graphql/Descriptions Gitlab::Graphql::Representation::TreeEntry.decorate(obj.blobs, obj.repository) end # rubocop: enable Graphql/AuthorizeTypes diff --git a/app/graphql/types/user_type.rb b/app/graphql/types/user_type.rb index 6b53554314b..9f7d2a171d6 100644 --- a/app/graphql/types/user_type.rb +++ b/app/graphql/types/user_type.rb @@ -8,9 +8,9 @@ module Types present_using UserPresenter - field :name, GraphQL::STRING_TYPE, null: false - field :username, GraphQL::STRING_TYPE, null: false - field :avatar_url, GraphQL::STRING_TYPE, null: false - field :web_url, GraphQL::STRING_TYPE, null: false + field :name, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :username, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :avatar_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions + field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions end end diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb index 6b43d52c775..0c1b2c7d093 100644 --- a/app/helpers/appearances_helper.rb +++ b/app/helpers/appearances_helper.rb @@ -78,3 +78,5 @@ module AppearancesHelper style.join end end + +AppearancesHelper.prepend_if_ee('EE::AppearancesHelper') diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1671aa5bd04..5c2420e80f2 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -325,3 +325,5 @@ module ApplicationHelper ::Appearance.current end end + +ApplicationHelper.prepend_if_ee('EE::ApplicationHelper') diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 93e282e44be..9a1a2b3a79c 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -309,3 +309,9 @@ module ApplicationSettingsHelper can?(current_user, :read_cluster, Clusters::Instance.new) end end + +ApplicationSettingsHelper.prepend_if_ee('EE::ApplicationSettingsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + +# The methods in `EE::ApplicationSettingsHelper` should be available as both +# instance and class methods. +ApplicationSettingsHelper.extend_if_ee('EE::ApplicationSettingsHelper') diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb index 31c4b27273b..9e6fcf6a267 100644 --- a/app/helpers/auth_helper.rb +++ b/app/helpers/auth_helper.rb @@ -110,3 +110,9 @@ module AuthHelper extend self end + +AuthHelper.prepend_if_ee('EE::AuthHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + +# The methods added in EE should be available as both class and instance +# methods, just like the methods provided by `AuthHelper` itself. +AuthHelper.extend_if_ee('EE::AuthHelper') diff --git a/app/helpers/award_emoji_helper.rb b/app/helpers/award_emoji_helper.rb index b97a95629f7..4bc5a7b090e 100644 --- a/app/helpers/award_emoji_helper.rb +++ b/app/helpers/award_emoji_helper.rb @@ -16,3 +16,5 @@ module AwardEmojiHelper end end end + +AwardEmojiHelper.prepend_if_ee('EE::AwardEmojiHelper') diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb index 8ef3ed9e8a5..d3950219f3f 100644 --- a/app/helpers/boards_helper.rb +++ b/app/helpers/boards_helper.rb @@ -107,3 +107,5 @@ module BoardsHelper serializer.represent(board).as_json end end + +BoardsHelper.prepend_if_ee('EE::BoardsHelper') diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index c759882d7f8..60c19e6fecd 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -9,3 +9,5 @@ module BranchesHelper ProtectedBranch.protected?(project, branch.name) end end + +BranchesHelper.prepend_if_ee('EE::BranchesHelper') diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb index 03adbfa204f..12cd5403f71 100644 --- a/app/helpers/button_helper.rb +++ b/app/helpers/button_helper.rb @@ -97,3 +97,5 @@ module ButtonHelper data: (data if data) end end + +ButtonHelper.prepend_if_ee('EE::ButtonHelper') diff --git a/app/helpers/clusters_helper.rb b/app/helpers/clusters_helper.rb index 769f75f57c4..7ca509873cc 100644 --- a/app/helpers/clusters_helper.rb +++ b/app/helpers/clusters_helper.rb @@ -21,3 +21,5 @@ module ClustersHelper !cluster.provider.legacy_abac? end end + +ClustersHelper.prepend_if_ee('EE::ClustersHelper') diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb index d71af08a656..518cb7c9714 100644 --- a/app/helpers/dashboard_helper.rb +++ b/app/helpers/dashboard_helper.rb @@ -52,3 +52,5 @@ module DashboardHelper links end end + +DashboardHelper.prepend_if_ee('EE::DashboardHelper') diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 23596769738..ee4991c0b53 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -191,3 +191,5 @@ module EmailsHelper current_appearance&.email_header_and_footer_enabled? end end + +EmailsHelper.prepend_if_ee('EE::EmailsHelper') diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb index 0f118c235d8..c642a64ad61 100644 --- a/app/helpers/environments_helper.rb +++ b/app/helpers/environments_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module EnvironmentsHelper + prepend_if_ee('::EE::EnvironmentsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + def environments_list_data { endpoint: project_environments_path(@project, format: :json) diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index f7c7f37cc38..bdb0a881b08 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module FormHelper + prepend_if_ee('::EE::FormHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + def form_errors(model, type: 'form') return unless model.errors.any? diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index 04cf43be452..f524696cc2f 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -194,3 +194,5 @@ module GitlabRoutingHelper take_ownership_project_pipeline_schedule_path(project, schedule, *args) end end + +GitlabRoutingHelper.include_if_ee('EE::GitlabRoutingHelper') diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb index a5d2f76820f..a8f6c974bbd 100644 --- a/app/helpers/groups/group_members_helper.rb +++ b/app/helpers/groups/group_members_helper.rb @@ -2,6 +2,8 @@ module Groups::GroupMembersHelper def group_member_select_options - { multiple: true, class: 'input-clamp', scope: :all, email_user: true } + { multiple: true, class: 'input-clamp qa-member-select-field ', scope: :all, email_user: true } end end + +Groups::GroupMembersHelper.prepend_if_ee('EE::Groups::GroupMembersHelper') diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index bd26bd01313..601560cca92 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -202,3 +202,5 @@ module GroupsHelper s_("GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup.").html_safe % { ancestor_group: ancestor_group(group) } end end + +GroupsHelper.prepend_if_ee('EE::GroupsHelper') diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index b88b25eb845..014523b54cb 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -447,3 +447,5 @@ module IssuablesHelper @project || @group end end + +IssuablesHelper.prepend_if_ee('EE::IssuablesHelper') diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 5476a7cdff6..d11b0594632 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -150,8 +150,28 @@ module IssuesHelper can?(current_user, :create_merge_request_in, @project) end + def issue_closed_link(issue, current_user, css_class: '') + if issue.moved? && can?(current_user, :read_issue, issue.moved_to) + link_to(s_('IssuableStatus|moved'), issue.moved_to, class: css_class) + elsif issue.duplicated? && can?(current_user, :read_issue, issue.duplicated_to) + link_to(s_('IssuableStatus|duplicated'), issue.duplicated_to, class: css_class) + end + end + + def issue_closed_text(issue, current_user) + link = issue_closed_link(issue, current_user, css_class: 'text-white text-underline') + + if link + s_('IssuableStatus|Closed (%{link})').html_safe % { link: link } + else + s_('IssuableStatus|Closed') + end + end + # Required for Banzai::Filter::IssueReferenceFilter module_function :url_for_issue module_function :url_for_internal_issue module_function :url_for_tracker_issue end + +IssuesHelper.include_if_ee('EE::IssuesHelper') diff --git a/app/helpers/kerberos_spnego_helper.rb b/app/helpers/kerberos_spnego_helper.rb index c0eb8f83f56..ed09ed755fe 100644 --- a/app/helpers/kerberos_spnego_helper.rb +++ b/app/helpers/kerberos_spnego_helper.rb @@ -9,3 +9,5 @@ module KerberosSpnegoHelper false # different behavior in GitLab Enterprise Edition end end + +KerberosSpnegoHelper.prepend_if_ee('EE::KerberosSpnegoHelper') diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb index c5a3507637e..3a872622e73 100644 --- a/app/helpers/labels_helper.rb +++ b/app/helpers/labels_helper.rb @@ -251,3 +251,5 @@ module LabelsHelper # Required for Banzai::Filter::LabelReferenceFilter module_function :render_colored_label, :text_color_for_bg, :escape_once, :label_tooltip_title end + +LabelsHelper.prepend_if_ee('EE::LabelsHelper') diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 2de4e92e33e..b8f6458b499 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -159,3 +159,5 @@ module MergeRequestsHelper end end end + +MergeRequestsHelper.prepend_if_ee('EE::MergeRequestsHelper') diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb index c1a04640688..e769734f27b 100644 --- a/app/helpers/milestones_helper.rb +++ b/app/helpers/milestones_helper.rb @@ -259,3 +259,5 @@ module MilestonesHelper end end end + +MilestonesHelper.prepend_if_ee('EE::MilestonesHelper') diff --git a/app/helpers/mirror_helper.rb b/app/helpers/mirror_helper.rb index 921c79ab771..6f6cb91e696 100644 --- a/app/helpers/mirror_helper.rb +++ b/app/helpers/mirror_helper.rb @@ -12,3 +12,5 @@ module MirrorHelper _('The Git LFS objects will <strong>not</strong> be synced.').html_safe end end + +MirrorHelper.prepend_if_ee('EE::MirrorHelper') diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index 572d68cb4a3..9de28fb3ed9 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -88,3 +88,5 @@ module NamespacesHelper [group_label.camelize, elements] end end + +NamespacesHelper.include_if_ee('EE::NamespacesHelper') diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb index a57ba5f3a4f..6aa910e6c3f 100644 --- a/app/helpers/nav_helper.rb +++ b/app/helpers/nav_helper.rb @@ -90,3 +90,5 @@ module NavHelper links end end + +NavHelper.prepend_if_ee('EE::NavHelper') diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 4e88b379e16..fbbdebaa623 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -188,3 +188,5 @@ module NotesHelper rendered_for_merge_request? || params['html'].nil? end end + +NotesHelper.prepend_if_ee('EE::NotesHelper') diff --git a/app/helpers/onboarding_experiment_helper.rb b/app/helpers/onboarding_experiment_helper.rb index ad49d333d7a..138fc60479d 100644 --- a/app/helpers/onboarding_experiment_helper.rb +++ b/app/helpers/onboarding_experiment_helper.rb @@ -2,6 +2,8 @@ module OnboardingExperimentHelper def allow_access_to_onboarding? - ::Gitlab.com? && Feature.enabled?(:user_onboarding) + ::Gitlab.dev_env_or_com? && Feature.enabled?(:user_onboarding) end end + +OnboardingExperimentHelper.prepend_if_ee('EE::OnboardingExperimentHelper') diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index 3672d8b1b03..6a271e93cd9 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -87,3 +87,5 @@ module PreferencesHelper first_day_of_week_choices.rassoc(Gitlab::CurrentSettings.first_day_of_week).first end end + +PreferencesHelper.prepend_if_ee('EE::PreferencesHelper') diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 14f947a03a3..3fb39a19cf0 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module ProjectsHelper + prepend_if_ee('::EE::ProjectsHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + def link_to_project(project) link_to namespace_project_path(namespace_id: project.namespace, id: project), title: h(project.name) do title = content_tag(:span, project.name, class: 'project-name') diff --git a/app/helpers/recaptcha_experiment_helper.rb b/app/helpers/recaptcha_experiment_helper.rb index d2eb9ac54f6..f15e92c0e99 100644 --- a/app/helpers/recaptcha_experiment_helper.rb +++ b/app/helpers/recaptcha_experiment_helper.rb @@ -5,3 +5,5 @@ module RecaptchaExperimentHelper !!Gitlab::Recaptcha.enabled? end end + +RecaptchaExperimentHelper.prepend_if_ee('EE::RecaptchaExperimentHelper') diff --git a/app/helpers/runners_helper.rb b/app/helpers/runners_helper.rb index 0d880c38a7b..d7a509e2bd3 100644 --- a/app/helpers/runners_helper.rb +++ b/app/helpers/runners_helper.rb @@ -39,3 +39,5 @@ module RunnersHelper end end end + +RunnersHelper.prepend_if_ee('EE::RunnersHelper') diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 2e2d324ab62..0f4e5adca6c 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -271,3 +271,5 @@ module SearchHelper end end end + +SearchHelper.prepend_if_ee('EE::SearchHelper') diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb index 2f802e4eab8..90c54123597 100644 --- a/app/helpers/selects_helper.rb +++ b/app/helpers/selects_helper.rb @@ -89,3 +89,5 @@ module SelectsHelper } end end + +SelectsHelper.prepend_if_ee('EE::SelectsHelper') diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb index d4b50b7ecfb..ea7c7af72d3 100644 --- a/app/helpers/services_helper.rb +++ b/app/helpers/services_helper.rb @@ -44,3 +44,9 @@ module ServicesHelper extend self end + +ServicesHelper.prepend_if_ee('EE::ServicesHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + +# The methods in `EE::ServicesHelper` should be available as both instance and +# class methods. +ServicesHelper.extend_if_ee('EE::ServicesHelper') diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb index a4eb76a2359..d680e10525d 100644 --- a/app/helpers/sorting_helper.rb +++ b/app/helpers/sorting_helper.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true module SortingHelper + prepend_if_ee('::EE::SortingHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + def sort_options_hash { sort_value_created_date => sort_title_created_date, diff --git a/app/helpers/system_note_helper.rb b/app/helpers/system_note_helper.rb index 3efae0a653c..51cbe93513d 100644 --- a/app/helpers/system_note_helper.rb +++ b/app/helpers/system_note_helper.rb @@ -39,3 +39,9 @@ module SystemNoteHelper extend self end + +SystemNoteHelper.prepend_if_ee('EE::SystemNoteHelper') # rubocop: disable Cop/InjectEnterpriseEditionModule + +# The methods in `EE::SystemNoteHelper` should be available as both instance and +# class methods. +SystemNoteHelper.extend_if_ee('EE::SystemNoteHelper') diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index d91f0f78db7..53739cb63e3 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -134,3 +134,5 @@ module TabHelper 'active' if current_controller?('oauth/applications') end end + +TabHelper.prepend_if_ee('EE::TabHelper') diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index f5333bb332e..a919c068c42 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -204,3 +204,5 @@ module TodosHelper groups.unshift({ id: '', text: 'Any Group' }).to_json end end + +TodosHelper.prepend_if_ee('EE::NotesHelper'); TodosHelper.prepend_if_ee('EE::TodosHelper') # rubocop: disable Style/Semicolon diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index bb1cdcb1b31..afa057421e0 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -187,3 +187,5 @@ module TreeHelper attrs end end + +TreeHelper.prepend_if_ee('::EE::TreeHelper') diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb index f10fadfdf49..cae3ec5f8d0 100644 --- a/app/helpers/user_callouts_helper.rb +++ b/app/helpers/user_callouts_helper.rb @@ -31,3 +31,5 @@ module UserCalloutsHelper current_user&.callouts&.find_by(feature_name: UserCallout.feature_names[feature_name]) end end + +UserCalloutsHelper.prepend_if_ee('EE::UserCalloutsHelper') diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index e38e3378e07..4ff25d021fb 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -109,3 +109,5 @@ module UsersHelper items end end + +UsersHelper.prepend_if_ee('EE::UsersHelper') diff --git a/app/helpers/version_check_helper.rb b/app/helpers/version_check_helper.rb index 5e519cf5c19..9e1204738c1 100644 --- a/app/helpers/version_check_helper.rb +++ b/app/helpers/version_check_helper.rb @@ -22,3 +22,5 @@ module VersionCheckHelper 'gitlab-ce' end end + +VersionCheckHelper.prepend_if_ee('EE::VersionCheckHelper') diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb index 864f9e2975a..d972d0dea28 100644 --- a/app/mailers/emails/merge_requests.rb +++ b/app/mailers/emails/merge_requests.rb @@ -117,3 +117,5 @@ module Emails end end end + +Emails::MergeRequests.prepend_if_ee('EE::Emails::MergeRequests') diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb index 8b93ead0ee6..c9a31b22207 100644 --- a/app/mailers/emails/notes.rb +++ b/app/mailers/emails/notes.rb @@ -69,3 +69,5 @@ module Emails end end end + +Emails::Notes.prepend_if_ee('EE::Emails::Notes') diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index f81f76f67f7..4acf4a1dc4f 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -57,3 +57,5 @@ module Emails end end end + +Emails::Projects.prepend_if_ee('EE::Emails::Projects') diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 3683f2ea9a9..6fa1c701cd8 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -228,3 +228,5 @@ class Notify < BaseMailer @unsubscribe_url = unsubscribe_sent_notification_url(@sent_notification) end end + +Notify.prepend_if_ee('EE::Notify') diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb index b3fab930922..3d42423ba46 100644 --- a/app/mailers/previews/notify_preview.rb +++ b/app/mailers/previews/notify_preview.rb @@ -210,3 +210,5 @@ class NotifyPreview < ActionMailer::Preview email end end + +NotifyPreview.prepend_if_ee('EE::Preview::NotifyPreview') diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index c9cd0140ed8..92526def144 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -315,3 +315,5 @@ class ApplicationSetting < ApplicationRecord recaptcha_enabled || login_recaptcha_protection_enabled end end + +ApplicationSetting.prepend_if_ee('EE::ApplicationSetting') diff --git a/app/models/audit_event.rb b/app/models/audit_event.rb index 6ef2914ac11..c2eef500fb0 100644 --- a/app/models/audit_event.rb +++ b/app/models/audit_event.rb @@ -19,3 +19,5 @@ class AuditEvent < ApplicationRecord self.user.name end end + +AuditEvent.prepend_if_ee('EE::AuditEvent') diff --git a/app/models/blob.rb b/app/models/blob.rb index d528bef8b19..a590536d5fe 100644 --- a/app/models/blob.rb +++ b/app/models/blob.rb @@ -243,3 +243,5 @@ class Blob < SimpleDelegator classes.find { |viewer_class| viewer_class.can_render?(self, verify_binary: verify_binary) } end end + +Blob.prepend_if_ee('EE::Blob') diff --git a/app/models/board.rb b/app/models/board.rb index b5d07f1b282..31011dc4742 100644 --- a/app/models/board.rb +++ b/app/models/board.rb @@ -41,3 +41,5 @@ class Board < ApplicationRecord false end end + +Board.prepend_if_ee('EE::Board') diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb index 1338a585c9e..dfcf28763ee 100644 --- a/app/models/broadcast_message.rb +++ b/app/models/broadcast_message.rb @@ -76,3 +76,5 @@ class BroadcastMessage < ApplicationRecord self.class.cache.expire(CACHE_KEY) end end + +BroadcastMessage.prepend_if_ee('EE::BroadcastMessage') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 644716ba8e7..6c51f650b6a 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -56,3 +56,5 @@ module Ci end end end + +::Ci::Bridge.prepend_if_ee('::EE::Ci::Bridge') diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 72782827906..71c4501f57b 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -868,3 +868,5 @@ module Ci end end end + +Ci::Build.prepend_if_ee('EE::Ci::Build') diff --git a/app/models/ci/build_runner_session.rb b/app/models/ci/build_runner_session.rb index 8075c15bbaf..b46bbe69c7c 100644 --- a/app/models/ci/build_runner_session.rb +++ b/app/models/ci/build_runner_session.rb @@ -37,3 +37,5 @@ module Ci end end end + +Ci::BuildRunnerSession.prepend_if_ee('EE::Ci::BuildRunnerSession') diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb index b4497d8af09..da2758507ce 100644 --- a/app/models/ci/job_artifact.rb +++ b/app/models/ci/job_artifact.rb @@ -198,3 +198,5 @@ module Ci end end end + +Ci::JobArtifact.prepend_if_ee('EE::Ci::JobArtifact') diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 29317cd530d..0c331b0b8c9 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -904,3 +904,5 @@ module Ci end end end + +Ci::Pipeline.prepend_if_ee('EE::Ci::Pipeline') diff --git a/app/models/ci/pipeline_enums.rb b/app/models/ci/pipeline_enums.rb index 0c2bd0aa8eb..cb92aef4bda 100644 --- a/app/models/ci/pipeline_enums.rb +++ b/app/models/ci/pipeline_enums.rb @@ -39,3 +39,5 @@ module Ci end end end + +Ci::PipelineEnums.prepend_if_ee('EE::Ci::PipelineEnums') diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb index e0e905ebfa8..c4a4410e8fc 100644 --- a/app/models/ci/runner.rb +++ b/app/models/ci/runner.rb @@ -35,7 +35,7 @@ module Ci FORM_EDITABLE = %i[description tag_list active run_untagged locked access_level maximum_timeout_human_readable].freeze - self.ignored_columns = %i[is_shared] + self.ignored_columns += %i[is_shared] has_many :builds has_many :runner_projects, inverse_of: :runner, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent @@ -335,3 +335,5 @@ module Ci end end end + +Ci::Runner.prepend_if_ee('EE::Ci::Runner') diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb index f31a6b8b50e..7a414d1a5bb 100644 --- a/app/models/clusters/applications/prometheus.rb +++ b/app/models/clusters/applications/prometheus.rb @@ -117,3 +117,5 @@ module Clusters end end end + +Clusters::Applications::Prometheus.prepend_if_ee('EE::Clusters::Applications::Prometheus') diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb index a976093ac0c..7855fb69bd6 100644 --- a/app/models/clusters/cluster.rb +++ b/app/models/clusters/cluster.rb @@ -268,3 +268,5 @@ module Clusters end end end + +Clusters::Cluster.prepend_if_ee('EE::Clusters::Cluster') diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb index 37614fbe3ca..89b50d8e8ff 100644 --- a/app/models/clusters/platforms/kubernetes.rb +++ b/app/models/clusters/platforms/kubernetes.rb @@ -201,3 +201,5 @@ module Clusters end end end + +Clusters::Platforms::Kubernetes.prepend_if_ee('EE::Clusters::Platforms::Kubernetes') diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 4be4d95b4a1..5d9d3179f9d 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -7,6 +7,8 @@ class CommitStatus < ApplicationRecord include Presentable include EnumWithNil + prepend_if_ee('::EE::CommitStatus') # rubocop: disable Cop/InjectEnterpriseEditionModule + self.table_name = 'ci_builds' belongs_to :user diff --git a/app/models/commit_status_enums.rb b/app/models/commit_status_enums.rb index 45e08fa18fe..a540e291990 100644 --- a/app/models/commit_status_enums.rb +++ b/app/models/commit_status_enums.rb @@ -19,3 +19,5 @@ module CommitStatusEnums } end end + +CommitStatusEnums.prepend_if_ee('EE::CommitStatusEnums') diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index a998d9b7e1b..d02f3731cc2 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -439,3 +439,6 @@ module Issuable respond_to?(:milestone_id) end end + +Issuable.prepend_if_ee('EE::Issuable') # rubocop: disable Cop/InjectEnterpriseEditionModule +Issuable::ClassMethods.prepend_if_ee('EE::Issuable::ClassMethods') diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb index 2f3f9b399d9..377600ef6e5 100644 --- a/app/models/concerns/mentionable.rb +++ b/app/models/concerns/mentionable.rb @@ -172,3 +172,5 @@ module Mentionable {} end end + +Mentionable.prepend_if_ee('EE::Mentionable') diff --git a/app/models/concerns/mentionable/reference_regexes.rb b/app/models/concerns/mentionable/reference_regexes.rb index b8fb3f71925..fec31cd262b 100644 --- a/app/models/concerns/mentionable/reference_regexes.rb +++ b/app/models/concerns/mentionable/reference_regexes.rb @@ -34,3 +34,5 @@ module Mentionable end end end + +Mentionable::ReferenceRegexes.prepend_if_ee('EE::Mentionable::ReferenceRegexes') diff --git a/app/models/concerns/noteable.rb b/app/models/concerns/noteable.rb index b3e4df730b4..6caa23ef9b7 100644 --- a/app/models/concerns/noteable.rb +++ b/app/models/concerns/noteable.rb @@ -143,3 +143,6 @@ module Noteable end Noteable.extend(Noteable::ClassMethods) + +Noteable::ClassMethods.prepend_if_ee('EE::Noteable::ClassMethods') # rubocop: disable Cop/InjectEnterpriseEditionModule +Noteable.prepend_if_ee('EE::Noteable') diff --git a/app/models/concerns/participable.rb b/app/models/concerns/participable.rb index b140fca9b83..af105629398 100644 --- a/app/models/concerns/participable.rb +++ b/app/models/concerns/participable.rb @@ -25,7 +25,6 @@ # users = issue.participants module Participable extend ActiveSupport::Concern - class_methods do # Adds a list of participant attributes. Attributes can either be symbols or # Procs. @@ -112,3 +111,5 @@ module Participable end end end + +Participable.prepend_if_ee('EE::Participable') diff --git a/app/models/concerns/prometheus_adapter.rb b/app/models/concerns/prometheus_adapter.rb index 9ac4722c6b1..aab0589f7ca 100644 --- a/app/models/concerns/prometheus_adapter.rb +++ b/app/models/concerns/prometheus_adapter.rb @@ -5,6 +5,8 @@ module PrometheusAdapter included do include ReactiveCaching + # We can't prepend outside of this model due to the use of `included`, so this must stay here. + prepend_if_ee('EE::PrometheusAdapter') # rubocop: disable Cop/InjectEnterpriseEditionModule self.reactive_cache_lease_timeout = 30.seconds self.reactive_cache_refresh_interval = 30.seconds diff --git a/app/models/concerns/protected_ref.rb b/app/models/concerns/protected_ref.rb index 0648b4a78e1..ebacc459cb5 100644 --- a/app/models/concerns/protected_ref.rb +++ b/app/models/concerns/protected_ref.rb @@ -67,3 +67,9 @@ module ProtectedRef @ref_matcher ||= RefMatcher.new(self.name) end end + +# Prepending a module into a concern doesn't work very well for class methods, +# since these are defined in a ClassMethods constant. As such, we prepend the +# module directly into ProtectedRef::ClassMethods, instead of prepending it into +# ProtectedRef. +ProtectedRef::ClassMethods.prepend_if_ee('EE::ProtectedRef') diff --git a/app/models/concerns/protected_ref_access.rb b/app/models/concerns/protected_ref_access.rb index 208937f2aff..01cb5a14762 100644 --- a/app/models/concerns/protected_ref_access.rb +++ b/app/models/concerns/protected_ref_access.rb @@ -2,7 +2,6 @@ module ProtectedRefAccess extend ActiveSupport::Concern - HUMAN_ACCESS_LEVELS = { Gitlab::Access::MAINTAINER => "Maintainers", Gitlab::Access::DEVELOPER => "Developers + Maintainers", @@ -51,3 +50,13 @@ module ProtectedRefAccess project.team.max_member_access(user.id) >= access_level end end + +ProtectedRefAccess.include_if_ee('EE::ProtectedRefAccess::Scopes') # rubocop: disable Cop/InjectEnterpriseEditionModule +ProtectedRefAccess.prepend_if_ee('EE::ProtectedRefAccess') # rubocop: disable Cop/InjectEnterpriseEditionModule + +# When using `prepend` (or `include` for that matter), the `ClassMethods` +# constants are not merged. This means that `class_methods` in +# `EE::ProtectedRefAccess` would be ignored. +# +# To work around this, we prepend the `ClassMethods` constant manually. +ProtectedRefAccess::ClassMethods.prepend_if_ee('EE::ProtectedRefAccess::ClassMethods') diff --git a/app/models/concerns/sha_attribute.rb b/app/models/concerns/sha_attribute.rb index 70ac873a030..177004deba6 100644 --- a/app/models/concerns/sha_attribute.rb +++ b/app/models/concerns/sha_attribute.rb @@ -47,3 +47,5 @@ module ShaAttribute end end end + +ShaAttribute::ClassMethods.prepend_if_ee('EE::ShaAttribute') diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb index 2a5ae7930e6..583e23d1274 100644 --- a/app/models/container_repository.rb +++ b/app/models/container_repository.rb @@ -96,3 +96,5 @@ class ContainerRepository < ApplicationRecord name: path.repository_name) end end + +ContainerRepository.prepend_if_ee('EE::ContainerRepository') diff --git a/app/models/diff_note.rb b/app/models/diff_note.rb index 861185dc222..0b00cf10714 100644 --- a/app/models/diff_note.rb +++ b/app/models/diff_note.rb @@ -173,3 +173,5 @@ class DiffNote < Note noteable.respond_to?(:repository) ? noteable.repository : project.repository end end + +DiffNote.prepend_if_ee('::EE::DiffNote') diff --git a/app/models/discussion_note.rb b/app/models/discussion_note.rb index 142cbdcdfa6..5049107da2c 100644 --- a/app/models/discussion_note.rb +++ b/app/models/discussion_note.rb @@ -4,6 +4,9 @@ # # A note of this type can be resolvable. class DiscussionNote < Note + # This prepend must stay here because the `validates` below depends on it. + prepend_if_ee('EE::DiscussionNote') # rubocop: disable Cop/InjectEnterpriseEditionModule + # Names of all implementers of `Noteable` that support discussions. def self.noteable_types %w(MergeRequest Issue Commit Snippet) diff --git a/app/models/environment.rb b/app/models/environment.rb index 1b53c4b45f9..3d3edcbbe66 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -246,3 +246,5 @@ class Environment < ApplicationRecord self.slug = Gitlab::Slug::Environment.new(name).generate end end + +Environment.prepend_if_ee('EE::Environment') diff --git a/app/models/epic.rb b/app/models/epic.rb index 3693db1de33..46723462590 100644 --- a/app/models/epic.rb +++ b/app/models/epic.rb @@ -15,3 +15,5 @@ class Epic < ApplicationRecord '&' end end + +Epic.prepend_if_ee('EE::Epic') diff --git a/app/models/event.rb b/app/models/event.rb index 580bb770599..205e1f71c74 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -409,3 +409,5 @@ class Event < ApplicationRecord UserInteractedProject.track(self) if UserInteractedProject.available? end end + +Event.prepend_if_ee('EE::Event') diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb index 59f5a7703e2..1d553fc8312 100644 --- a/app/models/global_milestone.rb +++ b/app/models/global_milestone.rb @@ -2,6 +2,7 @@ # Global Milestones are milestones that can be shared across multiple projects class GlobalMilestone include Milestoneish + include_if_ee('::EE::GlobalMilestone') # rubocop: disable Cop/InjectEnterpriseEditionModule STATE_COUNT_HASH = { opened: 0, closed: 0, all: 0 }.freeze diff --git a/app/models/group.rb b/app/models/group.rb index abe93cf3c84..1b62db04ab7 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -465,3 +465,5 @@ class Group < Namespace errors.add(:visibility_level, "#{visibility} is not allowed since there are sub-groups with higher visibility.") end end + +Group.prepend_if_ee('EE::Group') diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb index 97cb26c6ea9..bfda603c3cb 100644 --- a/app/models/group_milestone.rb +++ b/app/models/group_milestone.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true # Group Milestones are milestones that can be shared among many projects within the same group class GroupMilestone < GlobalMilestone + include_if_ee('::EE::GroupMilestone') # rubocop: disable Cop/InjectEnterpriseEditionModule attr_reader :group, :milestones def self.build_collection(group, projects, params) diff --git a/app/models/hooks/project_hook.rb b/app/models/hooks/project_hook.rb index 18c387f0d34..65e3eaf31e7 100644 --- a/app/models/hooks/project_hook.rb +++ b/app/models/hooks/project_hook.rb @@ -19,3 +19,5 @@ class ProjectHook < WebHook belongs_to :project validates :project, presence: true end + +ProjectHook.prepend_if_ee('EE::ProjectHook') diff --git a/app/models/identity.rb b/app/models/identity.rb index 1cbd50205ed..cb7fd553255 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -47,3 +47,5 @@ class Identity < ApplicationRecord user.user_synced_attributes_metadata&.destroy end end + +Identity.prepend_if_ee('EE::Identity') diff --git a/app/models/identity/uniqueness_scopes.rb b/app/models/identity/uniqueness_scopes.rb index ce68371ae87..c1890865a1c 100644 --- a/app/models/identity/uniqueness_scopes.rb +++ b/app/models/identity/uniqueness_scopes.rb @@ -9,3 +9,5 @@ class Identity < ApplicationRecord end end end + +Identity::UniquenessScopes.prepend_if_ee('EE::Identity::UniquenessScopes') diff --git a/app/models/issue.rb b/app/models/issue.rb index 7c5a139ab55..d0b2165fcc7 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -27,6 +27,7 @@ class Issue < ApplicationRecord belongs_to :project belongs_to :moved_to, class_name: 'Issue' + belongs_to :duplicated_to, class_name: 'Issue' belongs_to :closed_by, class_name: 'User' has_internal_id :iid, scope: :project, init: ->(s) { s&.project&.issues&.maximum(:iid) } @@ -181,6 +182,10 @@ class Issue < ApplicationRecord !moved_to_id.nil? end + def duplicated? + !duplicated_to_id.nil? + end + def can_move?(user, to_project = nil) if to_project return false unless user.can?(:admin_issue, to_project) @@ -293,3 +298,5 @@ class Issue < ApplicationRecord Gitlab::EtagCaching::Store.new.touch(key) end end + +Issue.prepend_if_ee('EE::Issue') diff --git a/app/models/issue_assignee.rb b/app/models/issue_assignee.rb index fbd9be1fb43..748f73373e3 100644 --- a/app/models/issue_assignee.rb +++ b/app/models/issue_assignee.rb @@ -4,3 +4,5 @@ class IssueAssignee < ApplicationRecord belongs_to :issue belongs_to :assignee, class_name: "User", foreign_key: :user_id end + +IssueAssignee.prepend_if_ee('EE::IssueAssignee') diff --git a/app/models/key.rb b/app/models/key.rb index 8aa25924c28..ff601966c26 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -140,3 +140,5 @@ class Key < ApplicationRecord "type is forbidden. Must be #{allowed_types}" end end + +Key.prepend_if_ee('EE::Key') diff --git a/app/models/label.rb b/app/models/label.rb index dc9f0a3d1a9..ea200b4937a 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -272,3 +272,5 @@ class Label < ApplicationRecord %w(color title).each { |attr| self[attr] = self[attr]&.strip } end end + +Label.prepend_if_ee('EE::Label') diff --git a/app/models/label_note.rb b/app/models/label_note.rb index ba5f1f82a81..13a2e1b0c72 100644 --- a/app/models/label_note.rb +++ b/app/models/label_note.rb @@ -103,3 +103,5 @@ class LabelNote < Note events.select { |e| e.action == action }.map(&field) end end + +LabelNote.prepend_if_ee('EE::LabelNote') diff --git a/app/models/legacy_diff_note.rb b/app/models/legacy_diff_note.rb index e2c75bc7ee9..df1ad8ea281 100644 --- a/app/models/legacy_diff_note.rb +++ b/app/models/legacy_diff_note.rb @@ -111,3 +111,5 @@ class LegacyDiffNote < Note diffs.find { |d| d.new_path == self.diff.new_path } end end + +LegacyDiffNote.prepend_if_ee('EE::LegacyDiffNote') diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb index 40695a97d97..60b11ad9356 100644 --- a/app/models/lfs_object.rb +++ b/app/models/lfs_object.rb @@ -42,3 +42,5 @@ class LfsObject < ApplicationRecord Digest::SHA256.file(path).hexdigest end end + +LfsObject.prepend_if_ee('EE::LfsObject') diff --git a/app/models/list.rb b/app/models/list.rb index ae7085f05a7..84c63f3fd6f 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -3,6 +3,8 @@ class List < ApplicationRecord include Importable + prepend_if_ee('::EE::List') # rubocop: disable Cop/InjectEnterpriseEditionModule + belongs_to :board belongs_to :label has_many :list_user_preferences diff --git a/app/models/member.rb b/app/models/member.rb index 6457fe9ef0c..e2d26773d45 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -459,3 +459,5 @@ class Member < ApplicationRecord end end end + +Member.prepend_if_ee('EE::Member') diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb index ed5832ff989..bdff9e28df1 100644 --- a/app/models/members/group_member.rb +++ b/app/models/members/group_member.rb @@ -76,3 +76,5 @@ class GroupMember < Member super end end + +GroupMember.prepend_if_ee('EE::GroupMember') diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index 2bb5806cd21..68c51860c47 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -146,3 +146,5 @@ class ProjectMember < Member end # rubocop: enable CodeReuse/ServiceClass end + +ProjectMember.prepend_if_ee('EE::ProjectMember') diff --git a/app/models/members_preloader.rb b/app/models/members_preloader.rb index 33855191ca8..1ed0434eacf 100644 --- a/app/models/members_preloader.rb +++ b/app/models/members_preloader.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class MembersPreloader + prepend_if_ee('EE::MembersPreloader') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :members def initialize(members) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 74f8067db0a..90061fe181e 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -23,6 +23,8 @@ class MergeRequest < ApplicationRecord SORTING_PREFERENCE_FIELD = :merge_requests_sort + prepend_if_ee('::EE::MergeRequest') # rubocop: disable Cop/InjectEnterpriseEditionModule + belongs_to :target_project, class_name: "Project" belongs_to :source_project, class_name: "Project" belongs_to :merge_user, class_name: "User" diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 7f46e5faf1a..4b9fee2bbdf 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -19,6 +19,8 @@ class Milestone < ApplicationRecord include FromUnion include Gitlab::SQL::Pattern + prepend_if_ee('::EE::Milestone') # rubocop: disable Cop/InjectEnterpriseEditionModule + cache_markdown_field :title, pipeline: :single_line cache_markdown_field :description diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 9f9c4288667..9a7c3dc03c3 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -354,3 +354,5 @@ class Namespace < ApplicationRecord end end end + +Namespace.prepend_if_ee('EE::Namespace') diff --git a/app/models/note.rb b/app/models/note.rb index 62b3f47fadd..7a62d70ca5d 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -520,3 +520,5 @@ class Note < ApplicationRecord system_note_metadata&.cross_reference_types&.include?(system_note_metadata&.action) end end + +Note.prepend_if_ee('EE::Note') diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb index bf2aec74ec8..981590b688f 100644 --- a/app/models/notification_setting.rb +++ b/app/models/notification_setting.rb @@ -80,3 +80,5 @@ class NotificationSetting < ApplicationRecord respond_to?(event) && !!public_send(event) # rubocop:disable GitlabSecurity/PublicSend end end + +NotificationSetting.prepend_if_ee('EE::NotificationSetting') diff --git a/app/models/pool_repository.rb b/app/models/pool_repository.rb index 50eed7344bd..25eab6e4e03 100644 --- a/app/models/pool_repository.rb +++ b/app/models/pool_repository.rb @@ -114,3 +114,5 @@ class PoolRepository < ApplicationRecord .new(self, prefix: Storage::HashedProject::POOL_PATH_PREFIX) end end + +PoolRepository.prepend_if_ee('EE::PoolRepository') diff --git a/app/models/project.rb b/app/models/project.rb index 12f5da05efa..04d68d31812 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2331,3 +2331,5 @@ class Project < ApplicationRecord @services_templates ||= Service.where(template: true) end end + +Project.prepend_if_ee('EE::Project') diff --git a/app/models/project_authorization.rb b/app/models/project_authorization.rb index f95d3ab54e2..e81d9d0f5fe 100644 --- a/app/models/project_authorization.rb +++ b/app/models/project_authorization.rb @@ -2,6 +2,7 @@ class ProjectAuthorization < ApplicationRecord include FromUnion + prepend_if_ee('::EE::ProjectAuthorization') # rubocop: disable Cop/InjectEnterpriseEditionModule belongs_to :user belongs_to :project diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb index 821e022f51b..a495d34c07c 100644 --- a/app/models/project_ci_cd_setting.rb +++ b/app/models/project_ci_cd_setting.rb @@ -36,3 +36,5 @@ class ProjectCiCdSetting < ApplicationRecord self.default_git_depth ||= DEFAULT_GIT_DEPTH end end + +ProjectCiCdSetting.prepend_if_ee('EE::ProjectCiCdSetting') diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb index efa3fbcf015..13b20b1fead 100644 --- a/app/models/project_feature.rb +++ b/app/models/project_feature.rb @@ -180,3 +180,5 @@ class ProjectFeature < ApplicationRecord project.team.member?(user, ProjectFeature.required_minimum_access_level(feature)) end end + +ProjectFeature.prepend_if_ee('EE::ProjectFeature') diff --git a/app/models/project_group_link.rb b/app/models/project_group_link.rb index feaf172d48d..0d3a2d4e398 100644 --- a/app/models/project_group_link.rb +++ b/app/models/project_group_link.rb @@ -52,3 +52,5 @@ class ProjectGroupLink < ApplicationRecord group.refresh_members_authorized_projects end end + +ProjectGroupLink.prepend_if_ee('EE::ProjectGroupLink') diff --git a/app/models/project_import_data.rb b/app/models/project_import_data.rb index 580e8dfd833..87ac6d38787 100644 --- a/app/models/project_import_data.rb +++ b/app/models/project_import_data.rb @@ -3,6 +3,8 @@ require 'carrierwave/orm/activerecord' class ProjectImportData < ApplicationRecord + prepend_if_ee('::EE::ProjectImportData') # rubocop: disable Cop/InjectEnterpriseEditionModule + belongs_to :project, inverse_of: :import_data attr_encrypted :credentials, key: Settings.attr_encrypted_db_key_base, diff --git a/app/models/project_import_state.rb b/app/models/project_import_state.rb index 23adffb33d8..bff00816e15 100644 --- a/app/models/project_import_state.rb +++ b/app/models/project_import_state.rb @@ -99,3 +99,5 @@ class ProjectImportState < ApplicationRecord Gitlab::SidekiqStatus.set(jid, StuckImportJobsWorker::IMPORT_JOBS_EXPIRATION) end end + +ProjectImportState.prepend_if_ee('EE::ProjectImportState') diff --git a/app/models/project_services/chat_message/merge_message.rb b/app/models/project_services/chat_message/merge_message.rb index 6b7a35aaa75..46313ba7bec 100644 --- a/app/models/project_services/chat_message/merge_message.rb +++ b/app/models/project_services/chat_message/merge_message.rb @@ -2,6 +2,8 @@ module ChatMessage class MergeMessage < BaseMessage + prepend_if_ee('::EE::ChatMessage::MergeMessage') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :merge_request_iid attr_reader :source_branch attr_reader :target_branch diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb index a69b7b4c4b6..3320405e9e9 100644 --- a/app/models/project_services/hipchat_service.rb +++ b/app/models/project_services/hipchat_service.rb @@ -309,3 +309,5 @@ class HipchatService < Service end end end + +HipchatService.prepend_if_ee('EE::HipchatService') diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 3a1130ffc15..b6ad46513db 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -146,3 +146,5 @@ class IssueTrackerService < Service end end end + +IssueTrackerService.prepend_if_ee('EE::IssueTrackerService') diff --git a/app/models/project_services/mock_deployment_service.rb b/app/models/project_services/mock_deployment_service.rb index 6f2b0f7747f..f80819de9fb 100644 --- a/app/models/project_services/mock_deployment_service.rb +++ b/app/models/project_services/mock_deployment_service.rb @@ -32,3 +32,5 @@ class MockDeploymentService < Service false end end + +MockDeploymentService.prepend_if_ee('EE::MockDeploymentService') diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb index 47999a3694e..b71ed75dde6 100644 --- a/app/models/project_statistics.rb +++ b/app/models/project_statistics.rb @@ -97,3 +97,5 @@ class ProjectStatistics < ApplicationRecord end end end + +ProjectStatistics.prepend_if_ee('EE::ProjectStatistics') diff --git a/app/models/project_team.rb b/app/models/project_team.rb index aeba2843e5d..de1fc55ba93 100644 --- a/app/models/project_team.rb +++ b/app/models/project_team.rb @@ -204,3 +204,5 @@ class ProjectTeam Member.on_project_and_ancestors(project).select(:user_id) end end + +ProjectTeam.prepend_if_ee('EE::ProjectTeam') diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index 4a19e05bf76..218be974218 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -225,3 +225,5 @@ class ProjectWiki @project.touch(:last_activity_at, :last_repository_updated_at) end end + +ProjectWiki.prepend_if_ee('EE::ProjectWiki') diff --git a/app/models/prometheus_metric.rb b/app/models/prometheus_metric.rb index c7786500c5c..08f4df7ea01 100644 --- a/app/models/prometheus_metric.rb +++ b/app/models/prometheus_metric.rb @@ -67,3 +67,5 @@ class PrometheusMetric < ApplicationRecord PrometheusMetricEnums.group_details.fetch(group.to_sym) end end + +PrometheusMetric.prepend_if_ee('EE::PrometheusMetric') diff --git a/app/models/prometheus_metric_enums.rb b/app/models/prometheus_metric_enums.rb index d58f825f222..cdd5e2acfce 100644 --- a/app/models/prometheus_metric_enums.rb +++ b/app/models/prometheus_metric_enums.rb @@ -76,3 +76,5 @@ module PrometheusMetricEnums }.freeze end end + +PrometheusMetricEnums.prepend_if_ee('EE::PrometheusMetricEnums') diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 9fd929371f8..8769d3eb916 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -41,3 +41,5 @@ class ProtectedBranch < ApplicationRecord project.protected_branches.select(:name) end end + +ProtectedBranch.prepend_if_ee('EE::ProtectedBranch') diff --git a/app/models/push_event_payload.rb b/app/models/push_event_payload.rb index 537859ec7b7..6a32c480b04 100644 --- a/app/models/push_event_payload.rb +++ b/app/models/push_event_payload.rb @@ -22,3 +22,5 @@ class PushEventPayload < ApplicationRecord tag: 1 } end + +PushEventPayload.prepend_if_ee('EE::PushEventPayload') diff --git a/app/models/remote_mirror.rb b/app/models/remote_mirror.rb index 41e63986286..c165a1a9b0d 100644 --- a/app/models/remote_mirror.rb +++ b/app/models/remote_mirror.rb @@ -304,3 +304,5 @@ class RemoteMirror < ApplicationRecord saved_change_to_url? || saved_change_to_credentials? end end + +RemoteMirror.prepend_if_ee('EE::RemoteMirror') diff --git a/app/models/repository.rb b/app/models/repository.rb index e5a83366776..9d6413c5991 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1172,3 +1172,5 @@ class Repository project.full_path) end end + +Repository.prepend_if_ee('EE::Repository') diff --git a/app/models/resource_label_event.rb b/app/models/resource_label_event.rb index ad08f4763ae..a6aa9ce0e7a 100644 --- a/app/models/resource_label_event.rb +++ b/app/models/resource_label_event.rb @@ -125,3 +125,5 @@ class ResourceLabelEvent < ApplicationRecord [self.class.name, created_at, user_id] end end + +ResourceLabelEvent.prepend_if_ee('EE::ResourceLabelEvent') diff --git a/app/models/service.rb b/app/models/service.rb index d866a51c42e..43ed0c7dfaa 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -352,3 +352,5 @@ class Service < ApplicationRecord activated? && !importing? end end + +Service.prepend_if_ee('EE::Service') diff --git a/app/models/snippet.rb b/app/models/snippet.rb index b2fca65b9e0..273a42e6034 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -227,3 +227,5 @@ class Snippet < ApplicationRecord end end end + +Snippet.prepend_if_ee('EE::Snippet') diff --git a/app/models/system_note_metadata.rb b/app/models/system_note_metadata.rb index a19755d286a..8ec90ca25d3 100644 --- a/app/models/system_note_metadata.rb +++ b/app/models/system_note_metadata.rb @@ -32,3 +32,5 @@ class SystemNoteMetadata < ApplicationRecord TYPES_WITH_CROSS_REFERENCES end end + +SystemNoteMetadata.prepend_if_ee('EE::SystemNoteMetadata') diff --git a/app/models/todo.rb b/app/models/todo.rb index f7f30aed832..aefd9d5ef28 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -207,3 +207,5 @@ class Todo < ApplicationRecord project.repository.keep_around(self.commit_id) end end + +Todo.prepend_if_ee('EE::Todo') diff --git a/app/models/upload.rb b/app/models/upload.rb index ca74f16b3b8..7560002ada8 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -125,3 +125,5 @@ class Upload < ApplicationRecord super&.to_sym end end + +Upload.prepend_if_ee('EE::Upload') diff --git a/app/models/user.rb b/app/models/user.rb index 48acdfeb2ed..c10a4143d1c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1668,3 +1668,5 @@ class User < ApplicationRecord project_creation_level: project_creation_levels) end end + +User.prepend_if_ee('EE::User') diff --git a/app/models/user_callout_enums.rb b/app/models/user_callout_enums.rb index 7b68e5076c7..772170a6b5b 100644 --- a/app/models/user_callout_enums.rb +++ b/app/models/user_callout_enums.rb @@ -18,3 +18,5 @@ module UserCalloutEnums } end end + +UserCalloutEnums.prepend_if_ee('EE::UserCalloutEnums') diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index b236250c24e..a36f56089a0 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -55,3 +55,5 @@ class UserPreference < ApplicationRecord "#{field_key}_notes_filter" end end + +UserPreference.prepend_if_ee('EE::UserPreference') diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb index 82bf9bf8bf6..78379516062 100644 --- a/app/policies/base_policy.rb +++ b/app/policies/base_policy.rb @@ -36,3 +36,5 @@ class BasePolicy < DeclarativePolicy::Base rule { default }.enable :read_cross_project end + +BasePolicy.prepend_if_ee('EE::BasePolicy') diff --git a/app/policies/ci/build_policy.rb b/app/policies/ci/build_policy.rb index 0ca3e696f46..ebb99270b9a 100644 --- a/app/policies/ci/build_policy.rb +++ b/app/policies/ci/build_policy.rb @@ -44,3 +44,5 @@ module Ci rule { can?(:update_build) & terminal }.enable :create_build_terminal end end + +Ci::BuildPolicy.prepend_if_ee('EE::Ci::BuildPolicy') diff --git a/app/policies/concerns/policy_actor.rb b/app/policies/concerns/policy_actor.rb index 069d065280e..b963a64b429 100644 --- a/app/policies/concerns/policy_actor.rb +++ b/app/policies/concerns/policy_actor.rb @@ -34,3 +34,5 @@ module PolicyActor false end end + +PolicyActor.prepend_if_ee('EE::PolicyActor') diff --git a/app/policies/environment_policy.rb b/app/policies/environment_policy.rb index d1243491f5a..be512dd3b94 100644 --- a/app/policies/environment_policy.rb +++ b/app/policies/environment_policy.rb @@ -14,3 +14,5 @@ class EnvironmentPolicy < BasePolicy rule { stop_with_deployment_allowed | stop_with_update_allowed }.enable :stop_environment end + +EnvironmentPolicy.prepend_if_ee('EE::EnvironmentPolicy') diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb index 311aab0dcd4..659fde574fc 100644 --- a/app/policies/global_policy.rb +++ b/app/policies/global_policy.rb @@ -75,3 +75,5 @@ class GlobalPolicy < BasePolicy enable :update_custom_attribute end end + +GlobalPolicy.prepend_if_ee('EE::GlobalPolicy') diff --git a/app/policies/group_member_policy.rb b/app/policies/group_member_policy.rb index 6f1afb87c85..f6e52def270 100644 --- a/app/policies/group_member_policy.rb +++ b/app/policies/group_member_policy.rb @@ -22,3 +22,5 @@ class GroupMemberPolicy < BasePolicy enable :destroy_group_member end end + +GroupMemberPolicy.prepend_if_ee('EE::GroupMemberPolicy') diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb index c726c7c24a7..f56ac0a5279 100644 --- a/app/policies/group_policy.rb +++ b/app/policies/group_policy.rb @@ -138,3 +138,5 @@ class GroupPolicy < BasePolicy @subject.max_member_access_for_user(@user) end end + +GroupPolicy.prepend_if_ee('EE::GroupPolicy') diff --git a/app/policies/identity_provider_policy.rb b/app/policies/identity_provider_policy.rb index d34cdd5bdd4..6d6dcaebff8 100644 --- a/app/policies/identity_provider_policy.rb +++ b/app/policies/identity_provider_policy.rb @@ -13,3 +13,5 @@ class IdentityProviderPolicy < BasePolicy rule { protected_provider }.prevent(:unlink) end + +IdentityProviderPolicy.prepend_if_ee('EE::IdentityProviderPolicy') diff --git a/app/policies/issue_policy.rb b/app/policies/issue_policy.rb index fa252af55e4..f86892227df 100644 --- a/app/policies/issue_policy.rb +++ b/app/policies/issue_policy.rb @@ -26,3 +26,5 @@ class IssuePolicy < IssuablePolicy prevent :reopen_issue end end + +IssuePolicy.prepend_if_ee('::EE::IssuePolicy') diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb index 5ad7bdabdff..e2aca2a37d5 100644 --- a/app/policies/merge_request_policy.rb +++ b/app/policies/merge_request_policy.rb @@ -11,3 +11,5 @@ class MergeRequestPolicy < IssuablePolicy # note permissions are shared, and this would apply too broadly. rule { ~can?(:read_merge_request) }.prevent :create_note end + +MergeRequestPolicy.prepend_if_ee('EE::MergeRequestPolicy') diff --git a/app/policies/namespace_policy.rb b/app/policies/namespace_policy.rb index 937666c7e54..fd3bdddded6 100644 --- a/app/policies/namespace_policy.rb +++ b/app/policies/namespace_policy.rb @@ -16,3 +16,5 @@ class NamespacePolicy < BasePolicy rule { personal_project & ~can_create_personal_project }.prevent :create_projects end + +NamespacePolicy.prepend_if_ee('EE::NamespacePolicy') diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index 5c36b59f07b..e6f8d1052ed 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -519,3 +519,5 @@ class ProjectPolicy < BasePolicy @subject end end + +ProjectPolicy.prepend_if_ee('EE::ProjectPolicy') diff --git a/app/policies/project_snippet_policy.rb b/app/policies/project_snippet_policy.rb index e5e005cee6d..424558be1fe 100644 --- a/app/policies/project_snippet_policy.rb +++ b/app/policies/project_snippet_policy.rb @@ -46,3 +46,5 @@ class ProjectSnippetPolicy < BasePolicy rule { ~can?(:read_project_snippet) }.prevent :create_note end + +ProjectSnippetPolicy.prepend_if_ee('EE::ProjectSnippetPolicy') diff --git a/app/policies/protected_branch_policy.rb b/app/policies/protected_branch_policy.rb index 0e83d2e5834..1a5c6528b82 100644 --- a/app/policies/protected_branch_policy.rb +++ b/app/policies/protected_branch_policy.rb @@ -9,3 +9,5 @@ class ProtectedBranchPolicy < BasePolicy enable :destroy_protected_branch end end + +ProtectedBranchPolicy.prepend_if_ee('EE::ProtectedBranchPolicy') diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb index a96f97988b2..73a048dfa56 100644 --- a/app/presenters/ci/pipeline_presenter.rb +++ b/app/presenters/ci/pipeline_presenter.rb @@ -91,3 +91,5 @@ module Ci end end end + +Ci::PipelinePresenter.prepend_if_ee('EE::Ci::PipelinePresenter') diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb index 49c64b31fc7..34dffbf40fd 100644 --- a/app/presenters/clusterable_presenter.rb +++ b/app/presenters/clusterable_presenter.rb @@ -81,3 +81,5 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated clusterable.clusters.empty? end end + +ClusterablePresenter.prepend_if_ee('EE::ClusterablePresenter') diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb index 28a25c8b7a3..f1182ec26f4 100644 --- a/app/presenters/commit_status_presenter.rb +++ b/app/presenters/commit_status_presenter.rb @@ -1,5 +1,4 @@ # frozen_string_literal: true - class CommitStatusPresenter < Gitlab::View::Presenter::Delegated CALLOUT_FAILURE_MESSAGES = { unknown_failure: 'There is an unknown failure, please try again', @@ -19,6 +18,8 @@ class CommitStatusPresenter < Gitlab::View::Presenter::Delegated presents :build + prepend_if_ee('::EE::CommitStatusPresenter') # rubocop: disable Cop/InjectEnterpriseEditionModule + def self.callout_failure_messages CALLOUT_FAILURE_MESSAGES end diff --git a/app/presenters/group_clusterable_presenter.rb b/app/presenters/group_clusterable_presenter.rb index f5b0bb64487..54cea19b18e 100644 --- a/app/presenters/group_clusterable_presenter.rb +++ b/app/presenters/group_clusterable_presenter.rb @@ -39,3 +39,5 @@ class GroupClusterablePresenter < ClusterablePresenter link_to(s_('ClusterIntegration|Learn more about group Kubernetes clusters'), help_page_path('user/group/clusters/index'), target: '_blank', rel: 'noopener noreferrer') end end + +GroupClusterablePresenter.prepend_if_ee('EE::GroupClusterablePresenter') diff --git a/app/presenters/group_member_presenter.rb b/app/presenters/group_member_presenter.rb index c4dcc9e60f9..df51f1eb075 100644 --- a/app/presenters/group_member_presenter.rb +++ b/app/presenters/group_member_presenter.rb @@ -15,3 +15,5 @@ class GroupMemberPresenter < MemberPresenter :destroy_group_member end end + +GroupMemberPresenter.prepend_if_ee('EE::GroupMemberPresenter') diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb index cce400ad2a1..908cd17678d 100644 --- a/app/presenters/instance_clusterable_presenter.rb +++ b/app/presenters/instance_clusterable_presenter.rb @@ -67,3 +67,5 @@ class InstanceClusterablePresenter < ClusterablePresenter link_to(s_('ClusterIntegration|Learn more about instance Kubernetes clusters'), help_page_path('user/instance/clusters/index'), target: '_blank', rel: 'noopener noreferrer') end end + +InstanceClusterablePresenter.prepend_if_ee('EE::InstanceClusterablePresenter') diff --git a/app/presenters/label_presenter.rb b/app/presenters/label_presenter.rb index 1077bf543d9..68aa05ada8e 100644 --- a/app/presenters/label_presenter.rb +++ b/app/presenters/label_presenter.rb @@ -49,3 +49,5 @@ class LabelPresenter < Gitlab::View::Presenter::Delegated issuable_subject || label.try(:subject) end end + +LabelPresenter.prepend_if_ee('EE::LabelPresenter') diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb index 2561c3f0244..0c67fc98ced 100644 --- a/app/presenters/member_presenter.rb +++ b/app/presenters/member_presenter.rb @@ -51,3 +51,5 @@ class MemberPresenter < Gitlab::View::Presenter::Delegated raise NotImplementedError end end + +MemberPresenter.prepend_if_ee('EE::MemberPresenter') diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb index 919d2653ec8..af98a6ee36a 100644 --- a/app/presenters/merge_request_presenter.rb +++ b/app/presenters/merge_request_presenter.rb @@ -258,3 +258,5 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated can?(current_user, :fork_project, project) end end + +MergeRequestPresenter.prepend_if_ee('EE::MergeRequestPresenter') diff --git a/app/presenters/project_clusterable_presenter.rb b/app/presenters/project_clusterable_presenter.rb index 8661ee02b68..3fab69fff7a 100644 --- a/app/presenters/project_clusterable_presenter.rb +++ b/app/presenters/project_clusterable_presenter.rb @@ -34,3 +34,5 @@ class ProjectClusterablePresenter < ClusterablePresenter link_to(s_('ClusterIntegration|Learn more about Kubernetes'), help_page_path('user/project/clusters/index'), target: '_blank', rel: 'noopener noreferrer') end end + +ProjectClusterablePresenter.prepend_if_ee('EE::ProjectClusterablePresenter') diff --git a/app/presenters/project_member_presenter.rb b/app/presenters/project_member_presenter.rb index e4731074e86..ff9c3df793a 100644 --- a/app/presenters/project_member_presenter.rb +++ b/app/presenters/project_member_presenter.rb @@ -15,3 +15,5 @@ class ProjectMemberPresenter < MemberPresenter :destroy_project_member end end + +ProjectMemberPresenter.prepend_if_ee('EE::ProjectMemberPresenter') diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb index 9afbaf035c7..6c300cd8be1 100644 --- a/app/presenters/project_presenter.rb +++ b/app/presenters/project_presenter.rb @@ -355,3 +355,5 @@ class ProjectPresenter < Gitlab::View::Presenter::Delegated ) end end + +ProjectPresenter.prepend_if_ee('EE::ProjectPresenter') diff --git a/app/serializers/blob_entity.rb b/app/serializers/blob_entity.rb index 3ac61481dea..a54af899ba2 100644 --- a/app/serializers/blob_entity.rb +++ b/app/serializers/blob_entity.rb @@ -15,3 +15,5 @@ class BlobEntity < Grape::Entity project_blob_path(request.project, File.join(request.ref, blob.path)) end end + +BlobEntity.prepend_if_ee('EE::BlobEntity') diff --git a/app/serializers/board_simple_entity.rb b/app/serializers/board_simple_entity.rb index 029d3808e75..a3c16a0b5c7 100644 --- a/app/serializers/board_simple_entity.rb +++ b/app/serializers/board_simple_entity.rb @@ -4,3 +4,5 @@ class BoardSimpleEntity < Grape::Entity expose :id expose :name end + +BoardSimpleEntity.prepend_if_ee('EE::BoardSimpleEntity') diff --git a/app/serializers/build_details_entity.rb b/app/serializers/build_details_entity.rb index 67e44ee9d10..0c754157267 100644 --- a/app/serializers/build_details_entity.rb +++ b/app/serializers/build_details_entity.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class BuildDetailsEntity < JobEntity + prepend_if_ee('::EE::BuildDetailEntity') # rubocop: disable Cop/InjectEnterpriseEditionModule + expose :coverage, :erased_at, :duration expose :tag_list, as: :tags expose :has_trace?, as: :has_trace diff --git a/app/serializers/cluster_basic_entity.rb b/app/serializers/cluster_basic_entity.rb new file mode 100644 index 00000000000..d104f2c8bbd --- /dev/null +++ b/app/serializers/cluster_basic_entity.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class ClusterBasicEntity < Grape::Entity + include RequestAwareEntity + + expose :name + expose :path, if: -> (cluster) { can?(request.current_user, :read_cluster, cluster) } do |cluster| + cluster.present(current_user: request.current_user).show_path + end +end diff --git a/app/serializers/current_board_entity.rb b/app/serializers/current_board_entity.rb index 371151532f8..f9d6691dc84 100644 --- a/app/serializers/current_board_entity.rb +++ b/app/serializers/current_board_entity.rb @@ -4,3 +4,5 @@ class CurrentBoardEntity < Grape::Entity expose :id expose :name end + +CurrentBoardEntity.prepend_if_ee('EE::CurrentBoardEntity') diff --git a/app/serializers/deployment_entity.rb b/app/serializers/deployment_entity.rb index 94a827658f0..e6421315b34 100644 --- a/app/serializers/deployment_entity.rb +++ b/app/serializers/deployment_entity.rb @@ -38,6 +38,8 @@ class DeploymentEntity < Grape::Entity expose :manual_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? } expose :scheduled_actions, using: JobEntity, if: -> (*) { include_details? && can_create_deployment? } + expose :cluster, using: ClusterBasicEntity + private def include_details? diff --git a/app/serializers/discussion_serializer.rb b/app/serializers/discussion_serializer.rb index 8bb7e93c033..7e7148b046e 100644 --- a/app/serializers/discussion_serializer.rb +++ b/app/serializers/discussion_serializer.rb @@ -17,3 +17,5 @@ class DiscussionSerializer < BaseSerializer opts.merge(additional_opts) end end + +DiscussionSerializer.prepend_if_ee('EE::DiscussionSerializer') diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb index 8258135da4e..bffd9de4978 100644 --- a/app/serializers/environment_entity.rb +++ b/app/serializers/environment_entity.rb @@ -66,3 +66,5 @@ class EnvironmentEntity < Grape::Entity deployment_platform.cluster end end + +EnvironmentEntity.prepend_if_ee('::EE::EnvironmentEntity') diff --git a/app/serializers/issuable_sidebar_basic_entity.rb b/app/serializers/issuable_sidebar_basic_entity.rb index 058c707ef9d..498cfe5930d 100644 --- a/app/serializers/issuable_sidebar_basic_entity.rb +++ b/app/serializers/issuable_sidebar_basic_entity.rb @@ -109,3 +109,5 @@ class IssuableSidebarBasicEntity < Grape::Entity request.current_user end end + +IssuableSidebarBasicEntity.prepend_if_ee('EE::IssuableSidebarBasicEntity') diff --git a/app/serializers/issue_board_entity.rb b/app/serializers/issue_board_entity.rb index 2e1d7fb3f87..b8f799a7456 100644 --- a/app/serializers/issue_board_entity.rb +++ b/app/serializers/issue_board_entity.rb @@ -50,3 +50,5 @@ class IssueBoardEntity < Grape::Entity project_labels_path(issue.project, format: :json, include_ancestor_groups: true) end end + +IssueBoardEntity.prepend_if_ee('EE::IssueBoardEntity') diff --git a/app/serializers/issue_entity.rb b/app/serializers/issue_entity.rb index 82139855760..a3d0298a495 100644 --- a/app/serializers/issue_entity.rb +++ b/app/serializers/issue_entity.rb @@ -2,6 +2,7 @@ class IssueEntity < IssuableEntity include TimeTrackableEntity + prepend_if_ee('::EE::IssueEntity') # rubocop: disable Cop/InjectEnterpriseEditionModule expose :state expose :milestone_id @@ -19,11 +20,17 @@ class IssueEntity < IssuableEntity expose :project_id expose :moved_to_id do |issue| - if issue.moved_to_id.present? && can?(request.current_user, :read_issue, issue.moved_to) + if issue.moved? && can?(request.current_user, :read_issue, issue.moved_to) issue.moved_to_id end end + expose :duplicated_to_id do |issue| + if issue.duplicated? && can?(request.current_user, :read_issue, issue.duplicated_to) + issue.duplicated_to_id + end + end + expose :web_url do |issue| project_issue_path(issue.project, issue) end diff --git a/app/serializers/issue_sidebar_basic_entity.rb b/app/serializers/issue_sidebar_basic_entity.rb index 723875809ec..165dc462cfe 100644 --- a/app/serializers/issue_sidebar_basic_entity.rb +++ b/app/serializers/issue_sidebar_basic_entity.rb @@ -4,3 +4,5 @@ class IssueSidebarBasicEntity < IssuableSidebarBasicEntity expose :due_date expose :confidential end + +IssueSidebarBasicEntity.prepend_if_ee('EE::IssueSidebarBasicEntity') diff --git a/app/serializers/issue_sidebar_extras_entity.rb b/app/serializers/issue_sidebar_extras_entity.rb index dee891a50b7..ea2a49baa41 100644 --- a/app/serializers/issue_sidebar_extras_entity.rb +++ b/app/serializers/issue_sidebar_extras_entity.rb @@ -2,3 +2,5 @@ class IssueSidebarExtrasEntity < IssuableSidebarExtrasEntity end + +IssueSidebarExtrasEntity.prepend_if_ee('EE::IssueSidebarExtrasEntity') diff --git a/app/serializers/merge_request_poll_widget_entity.rb b/app/serializers/merge_request_poll_widget_entity.rb index cd33ffa702a..854349e8507 100644 --- a/app/serializers/merge_request_poll_widget_entity.rb +++ b/app/serializers/merge_request_poll_widget_entity.rb @@ -130,3 +130,5 @@ class MergeRequestPollWidgetEntity < IssuableEntity @presenters[merge_request] ||= MergeRequestPresenter.new(merge_request, current_user: current_user) # rubocop: disable CodeReuse/Presenter end end + +MergeRequestPollWidgetEntity.prepend_if_ee('EE::MergeRequestPollWidgetEntity') diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb index 2f2c42a7387..eda7a36c2ee 100644 --- a/app/serializers/merge_request_widget_entity.rb +++ b/app/serializers/merge_request_widget_entity.rb @@ -79,3 +79,5 @@ class MergeRequestWidgetEntity < Grape::Entity @presenters[merge_request] ||= MergeRequestPresenter.new(merge_request, current_user: current_user) # rubocop: disable CodeReuse/Presenter end end + +MergeRequestWidgetEntity.prepend_if_ee('EE::MergeRequestWidgetEntity') diff --git a/app/serializers/pipeline_details_entity.rb b/app/serializers/pipeline_details_entity.rb index dfef4364965..808e87c3fcf 100644 --- a/app/serializers/pipeline_details_entity.rb +++ b/app/serializers/pipeline_details_entity.rb @@ -11,3 +11,5 @@ class PipelineDetailsEntity < PipelineEntity expose :scheduled_actions, using: BuildActionEntity end end + +PipelineDetailsEntity.prepend_if_ee('EE::PipelineDetailsEntity') diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 95d73c6422d..eaaeaf040a2 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -58,3 +58,5 @@ class PipelineSerializer < BaseSerializer ] end end + +PipelineSerializer.prepend_if_ee('EE::PipelineSerializer') diff --git a/app/serializers/project_mirror_entity.rb b/app/serializers/project_mirror_entity.rb index c13cc3276a7..2efd820d893 100644 --- a/app/serializers/project_mirror_entity.rb +++ b/app/serializers/project_mirror_entity.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ProjectMirrorEntity < Grape::Entity + prepend_if_ee('::EE::ProjectMirrorEntity') # rubocop: disable Cop/InjectEnterpriseEditionModule + expose :id expose :remote_mirrors_attributes, using: RemoteMirrorEntity do |project| diff --git a/app/serializers/user_preference_entity.rb b/app/serializers/user_preference_entity.rb index b99f80424db..4a5dda1e364 100644 --- a/app/serializers/user_preference_entity.rb +++ b/app/serializers/user_preference_entity.rb @@ -12,3 +12,5 @@ class UserPreferenceEntity < Grape::Entity UserPreference::NOTES_FILTERS[:all_notes] end end + +UserPreferenceEntity.prepend_if_ee('EE::UserPreferenceEntity') diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb index e06a87c4763..6400b182715 100644 --- a/app/services/application_settings/update_service.rb +++ b/app/services/application_settings/update_service.rb @@ -78,3 +78,5 @@ module ApplicationSettings end end end + +ApplicationSettings::UpdateService.prepend_if_ee('EE::ApplicationSettings::UpdateService') diff --git a/app/services/applications/create_service.rb b/app/services/applications/create_service.rb index dff0d9696f8..d71174d1393 100644 --- a/app/services/applications/create_service.rb +++ b/app/services/applications/create_service.rb @@ -15,3 +15,5 @@ module Applications end end end + +Applications::CreateService.prepend_if_ee('EE::Applications::CreateService') diff --git a/app/services/audit_event_service.rb b/app/services/audit_event_service.rb index 22ade0b0658..40761ee97d2 100644 --- a/app/services/audit_event_service.rb +++ b/app/services/audit_event_service.rb @@ -47,3 +47,5 @@ class AuditEventService SecurityEvent.create(base_payload.merge(details: @details)) end end + +AuditEventService.prepend_if_ee('EE::AuditEventService') diff --git a/app/services/auto_merge_service.rb b/app/services/auto_merge_service.rb index 053c6d71fbb..eee227be202 100644 --- a/app/services/auto_merge_service.rb +++ b/app/services/auto_merge_service.rb @@ -60,3 +60,5 @@ class AutoMergeService < BaseService self.class.get_service_class(strategy)&.new(project, current_user, params) end end + +AutoMergeService.prepend_if_ee('EE::AutoMergeService') diff --git a/app/services/base_count_service.rb b/app/services/base_count_service.rb index cfad2dd9265..2936bdae16e 100644 --- a/app/services/base_count_service.rb +++ b/app/services/base_count_service.rb @@ -48,3 +48,5 @@ class BaseCountService Rails.cache.write(key, block_given? ? yield : uncached_count, raw: raw?) end end + +BaseCountService.prepend_if_ee('EE::BaseCountService') diff --git a/app/services/boards/base_service.rb b/app/services/boards/base_service.rb index 205db47888e..439a5c06223 100644 --- a/app/services/boards/base_service.rb +++ b/app/services/boards/base_service.rb @@ -10,3 +10,5 @@ module Boards end end end + +Boards::BaseService.prepend_if_ee('EE::Boards::BaseService') diff --git a/app/services/boards/create_service.rb b/app/services/boards/create_service.rb index dd9358913fd..1a5dc790c41 100644 --- a/app/services/boards/create_service.rb +++ b/app/services/boards/create_service.rb @@ -24,3 +24,5 @@ module Boards end end end + +Boards::CreateService.prepend_if_ee('EE::Boards::CreateService') diff --git a/app/services/boards/issues/create_service.rb b/app/services/boards/issues/create_service.rb index bd045e18b8d..1769966a049 100644 --- a/app/services/boards/issues/create_service.rb +++ b/app/services/boards/issues/create_service.rb @@ -35,3 +35,5 @@ module Boards end end end + +Boards::Issues::CreateService.prepend_if_ee('EE::Boards::Issues::CreateService') diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb index 0b69661bbd0..10eb1141f59 100644 --- a/app/services/boards/issues/list_service.rb +++ b/app/services/boards/issues/list_service.rb @@ -110,3 +110,5 @@ module Boards end end end + +Boards::Issues::ListService.prepend_if_ee('EE::Boards::Issues::ListService') diff --git a/app/services/boards/issues/move_service.rb b/app/services/boards/issues/move_service.rb index 00ce27db7c8..9e3c84d03ec 100644 --- a/app/services/boards/issues/move_service.rb +++ b/app/services/boards/issues/move_service.rb @@ -137,3 +137,5 @@ module Boards end end end + +Boards::Issues::MoveService.prepend_if_ee('EE::Boards::Issues::MoveService') diff --git a/app/services/boards/list_service.rb b/app/services/boards/list_service.rb index edd1cc7c2e1..44d5a21b15f 100644 --- a/app/services/boards/list_service.rb +++ b/app/services/boards/list_service.rb @@ -18,3 +18,5 @@ module Boards end end end + +Boards::ListService.prepend_if_ee('EE::Boards::ListService') diff --git a/app/services/boards/lists/create_service.rb b/app/services/boards/lists/create_service.rb index 48d2d5abaec..eb417ac4f5f 100644 --- a/app/services/boards/lists/create_service.rb +++ b/app/services/boards/lists/create_service.rb @@ -48,3 +48,5 @@ module Boards end end end + +Boards::Lists::CreateService.prepend_if_ee('EE::Boards::Lists::CreateService') diff --git a/app/services/boards/lists/list_service.rb b/app/services/boards/lists/list_service.rb index 1f20ec8df9e..3609d9c6283 100644 --- a/app/services/boards/lists/list_service.rb +++ b/app/services/boards/lists/list_service.rb @@ -11,3 +11,5 @@ module Boards end end end + +Boards::Lists::ListService.prepend_if_ee('EE::Boards::Lists::ListService') diff --git a/app/services/boards/update_service.rb b/app/services/boards/update_service.rb index 88aced01ccd..0340836fd78 100644 --- a/app/services/boards/update_service.rb +++ b/app/services/boards/update_service.rb @@ -7,3 +7,5 @@ module Boards end end end + +Boards::UpdateService.prepend_if_ee('EE::Boards::UpdateService') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index d34cafce563..539576147f3 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -133,3 +133,5 @@ module Ci end end end + +Ci::CreatePipelineService.prepend_if_ee('EE::Ci::CreatePipelineService') diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb index d8d38128af6..32abd1a7626 100644 --- a/app/services/ci/expire_pipeline_cache_service.rb +++ b/app/services/ci/expire_pipeline_cache_service.rb @@ -60,3 +60,5 @@ module Ci end end end + +Ci::ExpirePipelineCacheService.prepend_if_ee('EE::Ci::ExpirePipelineCacheService') diff --git a/app/services/ci/pipeline_trigger_service.rb b/app/services/ci/pipeline_trigger_service.rb index 2dbb7c3917d..0e99f142492 100644 --- a/app/services/ci/pipeline_trigger_service.rb +++ b/app/services/ci/pipeline_trigger_service.rb @@ -52,3 +52,5 @@ module Ci end end end + +Ci::PipelineTriggerService.prepend_if_ee('EE::Ci::PipelineTriggerService') diff --git a/app/services/ci/process_build_service.rb b/app/services/ci/process_build_service.rb index d9f8e7cb452..eb92c7d1a27 100644 --- a/app/services/ci/process_build_service.rb +++ b/app/services/ci/process_build_service.rb @@ -43,3 +43,5 @@ module Ci end end end + +Ci::ProcessBuildService.prepend_if_ee('EE::Ci::ProcessBuildService') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 21055ad6617..d8f32ff88ce 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -182,3 +182,5 @@ module Ci end end end + +Ci::RegisterJobService.prepend_if_ee('EE::Ci::RegisterJobService') diff --git a/app/services/clusters/create_service.rb b/app/services/clusters/create_service.rb index bbbeb4b30e4..5c26c611e00 100644 --- a/app/services/clusters/create_service.rb +++ b/app/services/clusters/create_service.rb @@ -59,3 +59,5 @@ module Clusters end end end + +Clusters::CreateService.prepend_if_ee('EE::Clusters::CreateService') diff --git a/app/services/commits/create_service.rb b/app/services/commits/create_service.rb index f3be68f9602..b5401a8ea37 100644 --- a/app/services/commits/create_service.rb +++ b/app/services/commits/create_service.rb @@ -100,3 +100,5 @@ module Commits end end end + +Commits::CreateService.prepend_if_ee('EE::Commits::CreateService') diff --git a/app/services/deploy_keys/create_service.rb b/app/services/deploy_keys/create_service.rb index 0c935285657..2dac94c7ade 100644 --- a/app/services/deploy_keys/create_service.rb +++ b/app/services/deploy_keys/create_service.rb @@ -7,3 +7,5 @@ module DeployKeys end end end + +DeployKeys::CreateService.prepend_if_ee('::EE::DeployKeys::CreateService') diff --git a/app/services/emails/create_service.rb b/app/services/emails/create_service.rb index dc06a5caa40..473256d9c6f 100644 --- a/app/services/emails/create_service.rb +++ b/app/services/emails/create_service.rb @@ -11,3 +11,5 @@ module Emails end end end + +Emails::CreateService.prepend_if_ee('EE::Emails::CreateService') diff --git a/app/services/emails/destroy_service.rb b/app/services/emails/destroy_service.rb index 9ca1a03e172..a0b43ad3d08 100644 --- a/app/services/emails/destroy_service.rb +++ b/app/services/emails/destroy_service.rb @@ -17,3 +17,5 @@ module Emails end end end + +Emails::DestroyService.prepend_if_ee('EE::Emails::DestroyService') diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb index 39266a6c961..395c5fe09ac 100644 --- a/app/services/event_create_service.rb +++ b/app/services/event_create_service.rb @@ -115,3 +115,5 @@ class EventCreateService Event.create!(attributes) end end + +EventCreateService.prepend_if_ee('EE::EventCreateService') diff --git a/app/services/git/branch_hooks_service.rb b/app/services/git/branch_hooks_service.rb index d2b037a680c..9f9d12d6cf8 100644 --- a/app/services/git/branch_hooks_service.rb +++ b/app/services/git/branch_hooks_service.rb @@ -165,3 +165,5 @@ module Git end end end + +Git::BranchHooksService.prepend_if_ee('::EE::Git::BranchHooksService') diff --git a/app/services/git/branch_push_service.rb b/app/services/git/branch_push_service.rb index c4910180787..49c54e42b7c 100644 --- a/app/services/git/branch_push_service.rb +++ b/app/services/git/branch_push_service.rb @@ -90,3 +90,5 @@ module Git end end end + +Git::BranchPushService.prepend_if_ee('::EE::Git::BranchPushService') diff --git a/app/services/git/tag_hooks_service.rb b/app/services/git/tag_hooks_service.rb index 18eb780579f..e5b109c79d6 100644 --- a/app/services/git/tag_hooks_service.rb +++ b/app/services/git/tag_hooks_service.rb @@ -34,3 +34,5 @@ module Git end end end + +Git::TagHooksService.prepend_if_ee('::EE::Git::TagHooksService') diff --git a/app/services/git/wiki_push_service.rb b/app/services/git/wiki_push_service.rb index a053f133016..d4267d4a3c5 100644 --- a/app/services/git/wiki_push_service.rb +++ b/app/services/git/wiki_push_service.rb @@ -7,3 +7,5 @@ module Git end end end + +Git::WikiPushService.prepend_if_ee('EE::Git::WikiPushService') diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb index 1dd22d7a3ae..61bd50616b8 100644 --- a/app/services/groups/create_service.rb +++ b/app/services/groups/create_service.rb @@ -70,3 +70,5 @@ module Groups end end end + +Groups::CreateService.prepend_if_ee('EE::Groups::CreateService') diff --git a/app/services/groups/destroy_service.rb b/app/services/groups/destroy_service.rb index 9e00cbbbc55..c9c6b54a791 100644 --- a/app/services/groups/destroy_service.rb +++ b/app/services/groups/destroy_service.rb @@ -34,3 +34,5 @@ module Groups # rubocop: enable CodeReuse/ActiveRecord end end + +Groups::DestroyService.prepend_if_ee('EE::Groups::DestroyService') diff --git a/app/services/groups/update_service.rb b/app/services/groups/update_service.rb index 116756bacfe..534de601e20 100644 --- a/app/services/groups/update_service.rb +++ b/app/services/groups/update_service.rb @@ -66,3 +66,5 @@ module Groups end end end + +Groups::UpdateService.prepend_if_ee('EE::Groups::UpdateService') diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb index a322a306ba4..3c57fada677 100644 --- a/app/services/import/github_service.rb +++ b/app/services/import/github_service.rb @@ -46,3 +46,5 @@ module Import end end end + +Import::GithubService.prepend_if_ee('EE::Import::GithubService') diff --git a/app/services/issuable/clone/base_service.rb b/app/services/issuable/clone/base_service.rb index 42dd9c666f5..54576e82030 100644 --- a/app/services/issuable/clone/base_service.rb +++ b/app/services/issuable/clone/base_service.rb @@ -58,3 +58,5 @@ module Issuable end end end + +Issuable::Clone::BaseService.prepend_if_ee('EE::Issuable::Clone::BaseService') diff --git a/app/services/issuable/common_system_notes_service.rb b/app/services/issuable/common_system_notes_service.rb index 77f38f8882e..6329ba81e48 100644 --- a/app/services/issuable/common_system_notes_service.rb +++ b/app/services/issuable/common_system_notes_service.rb @@ -103,3 +103,5 @@ module Issuable end end end + +Issuable::CommonSystemNotesService.prepend_if_ee('EE::Issuable::CommonSystemNotesService') diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index 900e5063621..3e17d75c02c 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -414,3 +414,5 @@ class IssuableBaseService < BaseService issuable.changes.keys != ["relative_position"] end end + +IssuableBaseService.prepend_if_ee('EE::IssuableBaseService') diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb index 61615ac2058..daef468987e 100644 --- a/app/services/issues/build_service.rb +++ b/app/services/issues/build_service.rb @@ -77,3 +77,5 @@ module Issues end end end + +Issues::BuildService.prepend_if_ee('EE::Issues::BuildService') diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index 5793a15e1bc..8d1df0d87a7 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -49,3 +49,5 @@ module Issues end end end + +Issues::CreateService.prepend_if_ee('EE::Issues::CreateService') diff --git a/app/services/issues/duplicate_service.rb b/app/services/issues/duplicate_service.rb index 9b22f5e7914..82c226f601e 100644 --- a/app/services/issues/duplicate_service.rb +++ b/app/services/issues/duplicate_service.rb @@ -11,6 +11,7 @@ module Issues create_issue_canonical_note(canonical_issue, duplicate_issue) close_service.new(project, current_user, {}).execute(duplicate_issue) + duplicate_issue.update(duplicated_to: canonical_issue) end private diff --git a/app/services/issues/move_service.rb b/app/services/issues/move_service.rb index 334fadadb6f..2409396c1ac 100644 --- a/app/services/issues/move_service.rb +++ b/app/services/issues/move_service.rb @@ -64,3 +64,5 @@ module Issues end end end + +Issues::MoveService.prepend_if_ee('EE::Issues::MoveService') diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb index c8f4412c9f2..dc3c363f650 100644 --- a/app/services/issues/update_service.rb +++ b/app/services/issues/update_service.rb @@ -148,3 +148,5 @@ module Issues end end end + +Issues::UpdateService.prepend_if_ee('EE::Issues::UpdateService') diff --git a/app/services/keys/create_service.rb b/app/services/keys/create_service.rb index d9fa69a88d7..32c4ab645df 100644 --- a/app/services/keys/create_service.rb +++ b/app/services/keys/create_service.rb @@ -9,3 +9,5 @@ module Keys end end end + +Keys::CreateService.prepend_if_ee('EE::Keys::CreateService') diff --git a/app/services/keys/destroy_service.rb b/app/services/keys/destroy_service.rb index 159455f80f3..4552c5cf9a2 100644 --- a/app/services/keys/destroy_service.rb +++ b/app/services/keys/destroy_service.rb @@ -12,3 +12,5 @@ module Keys end end end + +Keys::DestroyService.prepend_if_ee('EE::Keys::DestroyService') diff --git a/app/services/lfs/lock_file_service.rb b/app/services/lfs/lock_file_service.rb index c7730d24bdc..383a0d6b4e3 100644 --- a/app/services/lfs/lock_file_service.rb +++ b/app/services/lfs/lock_file_service.rb @@ -41,3 +41,5 @@ module Lfs end end end + +Lfs::LockFileService.prepend_if_ee('EE::Lfs::LockFileService') diff --git a/app/services/lfs/unlock_file_service.rb b/app/services/lfs/unlock_file_service.rb index a42916d86bb..ea5a67b727f 100644 --- a/app/services/lfs/unlock_file_service.rb +++ b/app/services/lfs/unlock_file_service.rb @@ -45,3 +45,5 @@ module Lfs # rubocop: enable CodeReuse/ActiveRecord end end + +Lfs::UnlockFileService.prepend_if_ee('EE::Lfs::UnlockFileService') diff --git a/app/services/members/approve_access_request_service.rb b/app/services/members/approve_access_request_service.rb index 52b890d1821..e79c5f69a30 100644 --- a/app/services/members/approve_access_request_service.rb +++ b/app/services/members/approve_access_request_service.rb @@ -20,3 +20,5 @@ module Members end end end + +Members::ApproveAccessRequestService.prepend_if_ee('EE::Members::ApproveAccessRequestService') diff --git a/app/services/members/create_service.rb b/app/services/members/create_service.rb index d6b17ec10be..0b729981a93 100644 --- a/app/services/members/create_service.rb +++ b/app/services/members/create_service.rb @@ -52,3 +52,5 @@ module Members end end end + +Members::CreateService.prepend_if_ee('EE::Members::CreateService') diff --git a/app/services/members/destroy_service.rb b/app/services/members/destroy_service.rb index 0164760920f..20f64a99ad7 100644 --- a/app/services/members/destroy_service.rb +++ b/app/services/members/destroy_service.rb @@ -66,3 +66,5 @@ module Members end end end + +Members::DestroyService.prepend_if_ee('EE::Members::DestroyService') diff --git a/app/services/members/update_service.rb b/app/services/members/update_service.rb index ff8d5c1d8c9..fdd2c62a452 100644 --- a/app/services/members/update_service.rb +++ b/app/services/members/update_service.rb @@ -25,3 +25,5 @@ module Members end end end + +Members::UpdateService.prepend_if_ee('EE::Members::UpdateService') diff --git a/app/services/merge_request_metrics_service.rb b/app/services/merge_request_metrics_service.rb index 4e88b77c855..9ea71838011 100644 --- a/app/services/merge_request_metrics_service.rb +++ b/app/services/merge_request_metrics_service.rb @@ -19,3 +19,5 @@ class MergeRequestMetricsService update!(latest_closed_by_id: nil, latest_closed_at: nil) end end + +MergeRequestMetricsService.prepend_if_ee('EE::MergeRequestMetricsService') diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index c6aae4c28f2..7d4227e4a41 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -90,3 +90,5 @@ module MergeRequests end end end + +MergeRequests::BaseService.prepend_if_ee('EE::MergeRequests::BaseService') diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 88ed0c3ef4c..9cd6f3959fd 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -264,3 +264,5 @@ module MergeRequests end end end + +MergeRequests::BuildService.prepend_if_ee('EE::MergeRequests::BuildService') diff --git a/app/services/merge_requests/create_pipeline_service.rb b/app/services/merge_requests/create_pipeline_service.rb index 03246cc1920..9eb11820f7a 100644 --- a/app/services/merge_requests/create_pipeline_service.rb +++ b/app/services/merge_requests/create_pipeline_service.rb @@ -35,3 +35,5 @@ module MergeRequests end end end + +MergeRequests::CreatePipelineService.prepend_if_ee('EE::MergeRequests::CreatePipelineService') diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb index a69678a4422..1c730232abb 100644 --- a/app/services/merge_requests/create_service.rb +++ b/app/services/merge_requests/create_service.rb @@ -67,3 +67,5 @@ module MergeRequests end end end + +MergeRequests::CreateService.include_if_ee('EE::MergeRequests::CreateService') diff --git a/app/services/merge_requests/merge_base_service.rb b/app/services/merge_requests/merge_base_service.rb index 1ed396cee1e..3f7f8bcdcbf 100644 --- a/app/services/merge_requests/merge_base_service.rb +++ b/app/services/merge_requests/merge_base_service.rb @@ -72,3 +72,5 @@ module MergeRequests end end end + +MergeRequests::MergeBaseService.prepend_if_ee('EE::MergeRequests::MergeBaseService') diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb index c13f7dd5088..fbe6c48ac28 100644 --- a/app/services/merge_requests/post_merge_service.rb +++ b/app/services/merge_requests/post_merge_service.rb @@ -53,3 +53,5 @@ module MergeRequests end end end + +MergeRequests::PostMergeService.prepend_if_ee('EE::MergeRequests::PostMergeService') diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index 8961d2e1023..f54642d7bd9 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -257,3 +257,5 @@ module MergeRequests end end end + +MergeRequests::RefreshService.prepend_if_ee('EE::MergeRequests::RefreshService') diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb index d361e96babf..4acc3f1981a 100644 --- a/app/services/merge_requests/update_service.rb +++ b/app/services/merge_requests/update_service.rb @@ -130,3 +130,5 @@ module MergeRequests end end end + +MergeRequests::UpdateService.prepend_if_ee('EE::MergeRequests::UpdateService') diff --git a/app/services/milestones/promote_service.rb b/app/services/milestones/promote_service.rb index 0fe67067eb5..80e6456f729 100644 --- a/app/services/milestones/promote_service.rb +++ b/app/services/milestones/promote_service.rb @@ -89,3 +89,5 @@ module Milestones end end end + +Milestones::PromoteService.prepend_if_ee('EE::Milestones::PromoteService') diff --git a/app/services/milestones/update_service.rb b/app/services/milestones/update_service.rb index 01ab8b37bac..c445c816554 100644 --- a/app/services/milestones/update_service.rb +++ b/app/services/milestones/update_service.rb @@ -22,3 +22,5 @@ module Milestones # rubocop: enable CodeReuse/ActiveRecord end end + +Milestones::UpdateService.prepend_if_ee('EE::Milestones::UpdateService') diff --git a/app/services/notes/quick_actions_service.rb b/app/services/notes/quick_actions_service.rb index 0852a708240..076df10bf6f 100644 --- a/app/services/notes/quick_actions_service.rb +++ b/app/services/notes/quick_actions_service.rb @@ -54,3 +54,5 @@ module Notes end end end + +Notes::QuickActionsService.prepend_if_ee('EE::Notes::QuickActionsService') diff --git a/app/services/notification_recipient_service.rb b/app/services/notification_recipient_service.rb index ca3f0b73096..fca64270cae 100644 --- a/app/services/notification_recipient_service.rb +++ b/app/services/notification_recipient_service.rb @@ -400,3 +400,6 @@ module NotificationRecipientService end end end + +NotificationRecipientService::Builder::Default.prepend_if_ee('EE::NotificationRecipientBuilders::Default') # rubocop: disable Cop/InjectEnterpriseEditionModule +NotificationRecipientService.prepend_if_ee('EE::NotificationRecipientService') diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index a4243b7bc5e..ed357aa0392 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -622,3 +622,5 @@ class NotificationService source.respond_to?(:group) && source.group end end + +NotificationService.prepend_if_ee('EE::NotificationService') diff --git a/app/services/projects/after_rename_service.rb b/app/services/projects/after_rename_service.rb index fafdecb3222..2a35a07d555 100644 --- a/app/services/projects/after_rename_service.rb +++ b/app/services/projects/after_rename_service.rb @@ -139,3 +139,5 @@ module Projects end end end + +Projects::AfterRenameService.prepend_if_ee('EE::Projects::AfterRenameService') diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index 3dad90188cf..53bd954eab6 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -38,3 +38,5 @@ module Projects end end end + +Projects::AutocompleteService.prepend_if_ee('EE::Projects::AutocompleteService') diff --git a/app/services/projects/cleanup_service.rb b/app/services/projects/cleanup_service.rb index 5972bfd4071..9b4114ff42f 100644 --- a/app/services/projects/cleanup_service.rb +++ b/app/services/projects/cleanup_service.rb @@ -89,3 +89,5 @@ module Projects end end end + +Projects::CleanupService.prepend_if_ee('EE::Projects::CleanupService') diff --git a/app/services/projects/create_from_template_service.rb b/app/services/projects/create_from_template_service.rb index 678bc0d24c3..31977a7c76a 100644 --- a/app/services/projects/create_from_template_service.rb +++ b/app/services/projects/create_from_template_service.rb @@ -26,3 +26,5 @@ module Projects end end end + +Projects::CreateFromTemplateService.prepend_if_ee('EE::Projects::CreateFromTemplateService') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 942a45286b2..728eb039b54 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -199,3 +199,5 @@ module Projects end end end + +Projects::CreateService.prepend_if_ee('EE::Projects::CreateService') diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 108c4a79cde..5fdf98c3c5e 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -228,3 +228,5 @@ module Projects end end end + +Projects::DestroyService.prepend_if_ee('EE::Projects::DestroyService') diff --git a/app/services/projects/disable_deploy_key_service.rb b/app/services/projects/disable_deploy_key_service.rb index e483c0708c4..9fb2e3398b2 100644 --- a/app/services/projects/disable_deploy_key_service.rb +++ b/app/services/projects/disable_deploy_key_service.rb @@ -11,3 +11,5 @@ module Projects end end end + +Projects::DisableDeployKeyService.prepend_if_ee('EE::Projects::DisableDeployKeyService') diff --git a/app/services/projects/enable_deploy_key_service.rb b/app/services/projects/enable_deploy_key_service.rb index 38219cacee9..0a24137bd61 100644 --- a/app/services/projects/enable_deploy_key_service.rb +++ b/app/services/projects/enable_deploy_key_service.rb @@ -26,3 +26,5 @@ module Projects end end end + +Projects::EnableDeployKeyService.prepend_if_ee('EE::Projects::EnableDeployKeyService') diff --git a/app/services/projects/gitlab_projects_import_service.rb b/app/services/projects/gitlab_projects_import_service.rb index a315adf42f0..234ebbc6651 100644 --- a/app/services/projects/gitlab_projects_import_service.rb +++ b/app/services/projects/gitlab_projects_import_service.rb @@ -69,3 +69,5 @@ module Projects end end end + +Projects::GitlabProjectsImportService.prepend_if_ee('EE::Projects::GitlabProjectsImportService') diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb index e3d5bea0852..241948b335b 100644 --- a/app/services/projects/group_links/create_service.rb +++ b/app/services/projects/group_links/create_service.rb @@ -21,3 +21,5 @@ module Projects end end end + +Projects::GroupLinks::CreateService.prepend_if_ee('EE::Projects::GroupLinks::CreateService') diff --git a/app/services/projects/group_links/destroy_service.rb b/app/services/projects/group_links/destroy_service.rb index 8aefad048ce..c96dcaae8d5 100644 --- a/app/services/projects/group_links/destroy_service.rb +++ b/app/services/projects/group_links/destroy_service.rb @@ -11,3 +11,5 @@ module Projects end end end + +Projects::GroupLinks::DestroyService.prepend_if_ee('EE::Projects::GroupLinks::DestroyService') diff --git a/app/services/projects/hashed_storage/migrate_attachments_service.rb b/app/services/projects/hashed_storage/migrate_attachments_service.rb index affe6e5668d..0cbff283102 100644 --- a/app/services/projects/hashed_storage/migrate_attachments_service.rb +++ b/app/services/projects/hashed_storage/migrate_attachments_service.rb @@ -37,3 +37,5 @@ module Projects end end end + +Projects::HashedStorage::MigrateAttachmentsService.prepend_if_ee('EE::Projects::HashedStorage::MigrateAttachmentsService') diff --git a/app/services/projects/hashed_storage/migrate_repository_service.rb b/app/services/projects/hashed_storage/migrate_repository_service.rb index e8393128d58..e248a13c702 100644 --- a/app/services/projects/hashed_storage/migrate_repository_service.rb +++ b/app/services/projects/hashed_storage/migrate_repository_service.rb @@ -38,3 +38,5 @@ module Projects end end end + +Projects::HashedStorage::MigrateRepositoryService.prepend_if_ee('EE::Projects::HashedStorage::MigrateRepositoryService') diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb index 48eddb0e8d0..dd72c2844c2 100644 --- a/app/services/projects/operations/update_service.rb +++ b/app/services/projects/operations/update_service.rb @@ -47,3 +47,5 @@ module Projects end end end + +Projects::Operations::UpdateService.prepend_if_ee('::EE::Projects::Operations::UpdateService') diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index 078a751025f..4b3aca58dd7 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -168,3 +168,5 @@ module Projects end end end + +Projects::TransferService.prepend_if_ee('EE::Projects::TransferService') diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index 8acbdc7e02b..51a6f62e597 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -139,3 +139,5 @@ module Projects end end end + +Projects::UpdateService.prepend_if_ee('EE::Projects::UpdateService') diff --git a/app/services/protected_branches/access_level_params.rb b/app/services/protected_branches/access_level_params.rb index a7ef573ff0b..e34bc23b4dc 100644 --- a/app/services/protected_branches/access_level_params.rb +++ b/app/services/protected_branches/access_level_params.rb @@ -33,3 +33,5 @@ module ProtectedBranches end end end + +ProtectedBranches::AccessLevelParams.prepend_if_ee('EE::ProtectedBranches::AccessLevelParams') diff --git a/app/services/protected_branches/api_service.rb b/app/services/protected_branches/api_service.rb index 1b13dace5f2..ac4917d6590 100644 --- a/app/services/protected_branches/api_service.rb +++ b/app/services/protected_branches/api_service.rb @@ -15,3 +15,5 @@ module ProtectedBranches end end end + +ProtectedBranches::ApiService.prepend_if_ee('EE::ProtectedBranches::ApiService') diff --git a/app/services/protected_branches/create_service.rb b/app/services/protected_branches/create_service.rb index 6b2836bba39..3c86d7d087d 100644 --- a/app/services/protected_branches/create_service.rb +++ b/app/services/protected_branches/create_service.rb @@ -25,3 +25,5 @@ module ProtectedBranches end end end + +ProtectedBranches::CreateService.prepend_if_ee('EE::ProtectedBranches::CreateService') diff --git a/app/services/protected_branches/legacy_api_update_service.rb b/app/services/protected_branches/legacy_api_update_service.rb index 7cb8d41818f..65dc3297ae8 100644 --- a/app/services/protected_branches/legacy_api_update_service.rb +++ b/app/services/protected_branches/legacy_api_update_service.rb @@ -48,3 +48,5 @@ module ProtectedBranches end end end + +ProtectedBranches::LegacyApiUpdateService.prepend_if_ee('EE::ProtectedBranches::LegacyApiUpdateService') diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb index e0924608a6d..a14e0515a1f 100644 --- a/app/services/quick_actions/interpret_service.rb +++ b/app/services/quick_actions/interpret_service.rb @@ -177,3 +177,5 @@ module QuickActions # rubocop: enable CodeReuse/ActiveRecord end end + +QuickActions::InterpretService.prepend_if_ee('EE::QuickActions::InterpretService') diff --git a/app/services/resource_events/change_labels_service.rb b/app/services/resource_events/change_labels_service.rb index b45e567079b..e0d019f54be 100644 --- a/app/services/resource_events/change_labels_service.rb +++ b/app/services/resource_events/change_labels_service.rb @@ -40,3 +40,5 @@ module ResourceEvents end end end + +ResourceEvents::ChangeLabelsService.prepend_if_ee('EE::ResourceEvents::ChangeLabelsService') diff --git a/app/services/search/global_service.rb b/app/services/search/global_service.rb index 18a90c952fa..c841cbfaa00 100644 --- a/app/services/search/global_service.rb +++ b/app/services/search/global_service.rb @@ -35,3 +35,5 @@ module Search end end end + +Search::GlobalService.prepend_if_ee('EE::Search::GlobalService') diff --git a/app/services/search/group_service.rb b/app/services/search/group_service.rb index 6f3b5f00b86..4dbd9eb14bb 100644 --- a/app/services/search/group_service.rb +++ b/app/services/search/group_service.rb @@ -25,3 +25,5 @@ module Search end end end + +Search::GroupService.prepend_if_ee('EE::Search::GroupService') diff --git a/app/services/search/project_service.rb b/app/services/search/project_service.rb index 32d5cd7ddb2..17a322c2665 100644 --- a/app/services/search/project_service.rb +++ b/app/services/search/project_service.rb @@ -25,3 +25,5 @@ module Search end end end + +Search::ProjectService.prepend_if_ee('EE::Search::ProjectService') diff --git a/app/services/search/snippet_service.rb b/app/services/search/snippet_service.rb index e899a36f468..7c6c6878400 100644 --- a/app/services/search/snippet_service.rb +++ b/app/services/search/snippet_service.rb @@ -19,3 +19,5 @@ module Search end end end + +Search::SnippetService.prepend_if_ee('::EE::Search::SnippetService') diff --git a/app/services/search_service.rb b/app/services/search_service.rb index e0cbfac2420..91c0f9ba104 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -69,3 +69,5 @@ class SearchService attr_reader :current_user, :params end + +SearchService.prepend_if_ee('EE::SearchService') diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb index 34260d12a62..06d2037fb63 100644 --- a/app/services/system_hooks_service.rb +++ b/app/services/system_hooks_service.rb @@ -150,3 +150,5 @@ class SystemHooksService } end end + +SystemHooksService.prepend_if_ee('EE::SystemHooksService') diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb index 1b48b20e28b..ad8acb26a2d 100644 --- a/app/services/system_note_service.rb +++ b/app/services/system_note_service.rb @@ -706,3 +706,5 @@ module SystemNoteService ActionController::Base.helpers.content_tag(*args) end end + +SystemNoteService.prepend_if_ee('EE::SystemNoteService') diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index b1256df35d6..b1b0fb641df 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -333,3 +333,5 @@ class TodoService PendingTodosFinder.new(user, criteria).execute end end + +TodoService.prepend_if_ee('EE::TodoService') diff --git a/app/services/update_deployment_service.rb b/app/services/update_deployment_service.rb index dcafebae52d..730210c611a 100644 --- a/app/services/update_deployment_service.rb +++ b/app/services/update_deployment_service.rb @@ -53,3 +53,5 @@ class UpdateDeploymentService environment_options[:action] || 'start' end end + +UpdateDeploymentService.prepend_if_ee('EE::UpdateDeploymentService') diff --git a/app/services/user_project_access_changed_service.rb b/app/services/user_project_access_changed_service.rb index adca43660e8..21b52944800 100644 --- a/app/services/user_project_access_changed_service.rb +++ b/app/services/user_project_access_changed_service.rb @@ -15,3 +15,5 @@ class UserProjectAccessChangedService end end end + +UserProjectAccessChangedService.prepend_if_ee('EE::UserProjectAccessChangedService') diff --git a/app/services/users/build_service.rb b/app/services/users/build_service.rb index 026bcfcdaf4..8c85ad9ffd8 100644 --- a/app/services/users/build_service.rb +++ b/app/services/users/build_service.rb @@ -125,3 +125,5 @@ module Users end end end + +Users::BuildService.prepend_if_ee('EE::Users::BuildService') diff --git a/app/services/users/destroy_service.rb b/app/services/users/destroy_service.rb index 73fa6089945..e341c7f0537 100644 --- a/app/services/users/destroy_service.rb +++ b/app/services/users/destroy_service.rb @@ -64,3 +64,5 @@ module Users end end end + +Users::DestroyService.prepend_if_ee('EE::Users::DestroyService') diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb index a66b6627e40..e7186fdfb63 100644 --- a/app/services/users/migrate_to_ghost_user_service.rb +++ b/app/services/users/migrate_to_ghost_user_service.rb @@ -81,3 +81,5 @@ module Users end end end + +Users::MigrateToGhostUserService.prepend_if_ee('EE::Users::MigrateToGhostUserService') diff --git a/app/services/users/update_service.rb b/app/services/users/update_service.rb index 8f52e9cb23f..eea5ff6e5db 100644 --- a/app/services/users/update_service.rb +++ b/app/services/users/update_service.rb @@ -80,3 +80,5 @@ module Users end end end + +Users::UpdateService.prepend_if_ee('EE::Users::UpdateService') diff --git a/app/services/wiki_pages/base_service.rb b/app/services/wiki_pages/base_service.rb index b9df690c2b7..82c15ffc9b9 100644 --- a/app/services/wiki_pages/base_service.rb +++ b/app/services/wiki_pages/base_service.rb @@ -17,3 +17,5 @@ module WikiPages end end end + +WikiPages::BaseService.prepend_if_ee('EE::WikiPages::BaseService') diff --git a/app/uploaders/object_storage.rb b/app/uploaders/object_storage.rb index 499807d1438..f99ad987156 100644 --- a/app/uploaders/object_storage.rb +++ b/app/uploaders/object_storage.rb @@ -137,6 +137,8 @@ module ObjectStorage included do |base| base.include(ObjectStorage) + include_if_ee('::EE::ObjectStorage::Concern') # rubocop: disable Cop/InjectEnterpriseEditionModule + after :migrate, :delete_migrated_file end diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index 6052e5d96f2..00fdd5e9562 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -16,6 +16,7 @@ install_jupyter_path: clusterable.install_applications_cluster_path(@cluster, :jupyter), install_knative_path: clusterable.install_applications_cluster_path(@cluster, :knative), update_knative_path: clusterable.update_applications_cluster_path(@cluster, :knative), + cluster_environments_path: clusterable.environments_cluster_path(@cluster), toggle_status: @cluster.enabled? ? 'true': 'false', has_rbac: has_rbac_enabled?(@cluster) ? 'true': 'false', cluster_type: @cluster.cluster_type, diff --git a/app/views/groups/group_members/_new_group_member.html.haml b/app/views/groups/group_members/_new_group_member.html.haml index 8b511f6866f..93dd8f48a60 100644 --- a/app/views/groups/group_members/_new_group_member.html.haml +++ b/app/views/groups/group_members/_new_group_member.html.haml @@ -19,4 +19,4 @@ On this date, the member(s) will automatically lose access to this group and all of its projects. .col-md-2 - = f.submit 'Add to group', class: "btn btn-success btn-block" + = f.submit 'Add to group', class: "btn btn-success btn-block", data: { qa_selector: 'add_to_group_button' } diff --git a/app/views/groups/settings/_general.html.haml b/app/views/groups/settings/_general.html.haml index db1849ebb45..73a0c8ff02b 100644 --- a/app/views/groups/settings/_general.html.haml +++ b/app/views/groups/settings/_general.html.haml @@ -6,7 +6,7 @@ .row .form-group.col-md-5 = f.label :name, _('Group name'), class: 'label-bold' - = f.text_field :name, class: 'form-control' + = f.text_field :name, class: 'form-control', data: { qa_selector: 'group_name_field' } .form-group.col-md-7 = f.label :id, _('Group ID'), class: 'label-bold' @@ -30,4 +30,4 @@ = render 'shared/visibility_level', f: f, visibility_level: @group.visibility_level, can_change_visibility_level: can_change_group_visibility_level?(@group), form_model: @group - = f.submit _('Save changes'), class: 'btn btn-success mt-4 js-dirty-submit' + = f.submit _('Save changes'), class: 'btn btn-success mt-4 js-dirty-submit', data: { qa_selector: 'save_name_visibility_settings_button' } diff --git a/app/views/groups/settings/_lfs.html.haml b/app/views/groups/settings/_lfs.html.haml index 4674d561c12..66fdd1c11da 100644 --- a/app/views/groups/settings/_lfs.html.haml +++ b/app/views/groups/settings/_lfs.html.haml @@ -7,7 +7,7 @@ .form-group.append-bottom-default .form-check - = f.check_box :lfs_enabled, checked: @group.lfs_enabled?, class: 'form-check-input' + = f.check_box :lfs_enabled, checked: @group.lfs_enabled?, class: 'form-check-input', data: { qa_selector: 'lfs_checkbox' } = f.label :lfs_enabled, class: 'form-check-label' do %span = _('Allow projects within this group to use Git LFS') diff --git a/app/views/groups/settings/_project_creation_level.html.haml b/app/views/groups/settings/_project_creation_level.html.haml index 9f711e6aade..36b714535d2 100644 --- a/app/views/groups/settings/_project_creation_level.html.haml +++ b/app/views/groups/settings/_project_creation_level.html.haml @@ -1,3 +1,3 @@ .form-group = f.label s_('ProjectCreationLevel|Allowed to create projects'), class: 'label-bold' - = f.select :project_creation_level, options_for_select(::Gitlab::Access.project_creation_options, group.project_creation_level), {}, class: 'form-control' + = f.select :project_creation_level, options_for_select(::Gitlab::Access.project_creation_options, group.project_creation_level), {}, class: 'form-control', data: { qa_selector: 'project_creation_level_dropdown' } diff --git a/app/views/groups/settings/_two_factor_auth.html.haml b/app/views/groups/settings/_two_factor_auth.html.haml index 5d3f1cbb279..c49e61c8a31 100644 --- a/app/views/groups/settings/_two_factor_auth.html.haml +++ b/app/views/groups/settings/_two_factor_auth.html.haml @@ -7,7 +7,7 @@ .form-group .form-check - = f.check_box :require_two_factor_authentication, class: 'form-check-input' + = f.check_box :require_two_factor_authentication, class: 'form-check-input', data: { qa_selector: 'require_2fa_checkbox' } = f.label :require_two_factor_authentication, class: 'form-check-label' do %span= _('Require all users in this group to setup Two-factor authentication') .form-group diff --git a/app/views/projects/_export.html.haml b/app/views/projects/_export.html.haml index e42772c2dd9..f564ed41760 100644 --- a/app/views/projects/_export.html.haml +++ b/app/views/projects/_export.html.haml @@ -26,9 +26,9 @@ %p= _('Once the exported file is ready, you will receive a notification email with a download link, or you can download it from this page.') - if project.export_status == :finished = link_to _('Download export'), download_export_project_path(project), - rel: 'nofollow', download: '', method: :get, class: "btn btn-default" + rel: 'nofollow', download: '', method: :get, class: "btn btn-default", data: { qa_selector: 'download_export_link' } = link_to _('Generate new export'), generate_new_export_project_path(project), method: :post, class: "btn btn-default" - else = link_to _('Export project'), export_project_path(project), - method: :post, class: "btn btn-default" + method: :post, class: "btn btn-default", data: { qa_selector: 'export_project_link' } diff --git a/app/views/projects/buttons/_download.html.haml b/app/views/projects/buttons/_download.html.haml index 4762045ee96..96df3cd18fe 100644 --- a/app/views/projects/buttons/_download.html.haml +++ b/app/views/projects/buttons/_download.html.haml @@ -3,7 +3,7 @@ - if !project.empty_repo? && can?(current_user, :download_code, project) - archive_prefix = "#{project.path}-#{ref.tr('/', '-')}" .project-action-button.dropdown.inline> - %button.btn.has-tooltip{ title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static' } + %button.btn.has-tooltip{ title: s_('DownloadSource|Download'), 'data-toggle' => 'dropdown', 'aria-label' => s_('DownloadSource|Download'), 'data-display' => 'static', data: { qa_selector: 'download_source_code_button' } } = sprite_icon('download') %span.sr-only= _('Select Archive Format') = sprite_icon("arrow-down") diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 763cc764144..b5e24cbbffb 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -10,7 +10,7 @@ %p= _('Update your project name, topics, description and avatar.') .settings-content= render 'projects/settings/general' -%section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded) } +%section.settings.sharing-permissions.no-animate#js-shared-permissions{ class: ('expanded' if expanded), data: { qa_selector: 'visibility_features_permissions_content' } } .settings-header %h4.settings-title.js-settings-toggle.js-settings-toggle-trigger-only= _('Visibility, project features, permissions') %button.btn.btn-default.js-settings-toggle{ type: 'button' }= expanded ? _('Collapse') : _('Expand') @@ -21,7 +21,7 @@ %input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' } %template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data_json(@project) .js-project-permissions-form - = f.submit _('Save changes'), class: "btn btn-success" + = f.submit _('Save changes'), class: "btn btn-success", data: { qa_selector: 'visibility_features_permissions_save_button' } %section.qa-merge-request-settings.rspec-merge-request-settings.settings.merge-requests-feature.no-animate#js-merge-request-settings{ class: [('expanded' if expanded), ('hidden' if @project.project_feature.send(:merge_requests_access_level) == 0)] } .settings-header @@ -81,12 +81,12 @@ - if @project.archived? %p= _("Unarchiving the project will restore people's ability to make changes to it. The repository can be committed to, and issues, comments and other entities can be created. <strong>Once active this project shows up in the search and on the dashboard.</strong>").html_safe = link_to _('Unarchive project'), unarchive_project_path(@project), - data: { confirm: _("Are you sure that you want to unarchive this project?") }, + data: { confirm: _("Are you sure that you want to unarchive this project?"), qa_selector: 'unarchive_project_link' }, method: :post, class: "btn btn-success" - else %p= _("Archiving the project will make it entirely read-only. It is hidden from the dashboard and doesn't show up in searches. <strong>The repository cannot be committed to, and no issues, comments or other entities can be created.</strong>").html_safe = link_to _('Archive project'), archive_project_path(@project), - data: { confirm: _("Are you sure that you want to archive this project?") }, + data: { confirm: _("Are you sure that you want to archive this project?"), qa_selector: 'archive_project_link' }, method: :post, class: "btn btn-warning" .sub-section.rename-repository %h4.warning-title= _('Change path') diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 8ec07dc3bb4..1843ad7bb75 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -15,13 +15,7 @@ .issuable-status-box.status-box.status-box-issue-closed{ class: issue_button_visibility(@issue, false) } = sprite_icon('mobile-issue-close', size: 16, css_class: 'd-block d-sm-none') .d-none.d-sm-block - - if @issue.moved? && can?(current_user, :read_issue, @issue.moved_to) - - moved_link_start = "<a href=\"#{issue_path(@issue.moved_to)}\" class=\"text-white text-underline\">".html_safe - - moved_link_end = '</a>'.html_safe - = s_('IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})').html_safe % {moved_link_start: moved_link_start, - moved_link_end: moved_link_end} - - else - = _("Closed") + = issue_closed_text(@issue, current_user) .issuable-status-box.status-box.status-box-open{ class: issue_button_visibility(@issue, true) } = sprite_icon('issue-open-m', size: 16, css_class: 'd-block d-sm-none') %span.d-none.d-sm-block Open diff --git a/app/views/projects/project_members/_new_project_group.html.haml b/app/views/projects/project_members/_new_project_group.html.haml index 079811e4e79..d413048ca10 100644 --- a/app/views/projects/project_members/_new_project_group.html.haml +++ b/app/views/projects/project_members/_new_project_group.html.haml @@ -3,7 +3,7 @@ = form_tag project_group_links_path(@project), class: 'js-requires-input', method: :post do .form-group = label_tag :link_group_id, _("Select a group to invite"), class: "label-bold" - = groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups }, class: "input-clamp", required: true) + = groups_select_tag(:link_group_id, data: { skip_groups: @skip_groups }, class: "input-clamp qa-group-select-field", required: true) .form-group = label_tag :link_group_access, _("Max access level"), class: "label-bold" .select-wrapper @@ -18,4 +18,4 @@ .clearable-input = text_field_tag :expires_at, nil, class: 'form-control js-access-expiration-date-groups', placeholder: _('Expiration date'), id: 'expires_at_groups' %i.clear-icon.js-clear-input - = submit_tag _("Invite"), class: "btn btn-success" + = submit_tag _("Invite"), class: "btn btn-success", data: { qa_selector: 'invite_group_button' } diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml index cc98ba64f08..24fe583a9b5 100644 --- a/app/views/projects/project_members/index.html.haml +++ b/app/views/projects/project_members/index.html.haml @@ -19,7 +19,7 @@ %li.nav-tab{ role: 'presentation' } %a.nav-link.active{ href: '#invite-member-pane', id: 'invite-member-tab', data: { toggle: 'tab' }, role: 'tab' }= _("Invite member") %li.nav-tab{ role: 'presentation', class: ('active' if membership_locked?) } - %a.nav-link{ href: '#invite-group-pane', id: 'invite-group-tab', data: { toggle: 'tab' }, role: 'tab' }= _("Invite group") + %a.nav-link{ href: '#invite-group-pane', id: 'invite-group-tab', data: { toggle: 'tab', qa_selector: 'invite_group_tab' }, role: 'tab' }= _("Invite group") .tab-content.gitlab-tab-content .tab-pane.active{ id: 'invite-member-pane', role: 'tabpanel' } diff --git a/app/views/shared/_allow_request_access.html.haml b/app/views/shared/_allow_request_access.html.haml index a50f1877d08..2b24bde9e59 100644 --- a/app/views/shared/_allow_request_access.html.haml +++ b/app/views/shared/_allow_request_access.html.haml @@ -1,7 +1,7 @@ - label_class = local_assigns.fetch(:bold_label, false) ? 'font-weight-bold' : '' .form-check - = form.check_box :request_access_enabled, class: 'form-check-input' + = form.check_box :request_access_enabled, class: 'form-check-input', data: { qa_selector: 'request_access_checkbox' } = form.label :request_access_enabled, class: 'form-check-label' do %span{ class: label_class }= _('Allow users to request access') %br diff --git a/app/views/shared/_visibility_radios.html.haml b/app/views/shared/_visibility_radios.html.haml index 82ffdc9cd13..80532c9187b 100644 --- a/app/views/shared/_visibility_radios.html.haml +++ b/app/views/shared/_visibility_radios.html.haml @@ -4,7 +4,7 @@ - next if disallowed || restricted .form-check - = form.radio_button model_method, level, checked: (selected_level == level), class: 'form-check-input', data: { track_label: "blank_project", track_event: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "" } + = form.radio_button model_method, level, checked: (selected_level == level), class: 'form-check-input', data: { track_label: "blank_project", track_event: "activate_form_input", track_property: "#{model_method}_#{level}", track_value: "", qa_selector: "#{visibility_level_label(level).downcase}_radio" } = form.label "#{model_method}_#{level}", class: 'form-check-label' do = visibility_level_icon(level) .option-title diff --git a/app/views/shared/members/_group.html.haml b/app/views/shared/members/_group.html.haml index 42a823e3a8d..18368ecc9ff 100644 --- a/app/views/shared/members/_group.html.haml +++ b/app/views/shared/members/_group.html.haml @@ -5,7 +5,7 @@ -# Note this is just for groups. For individual members please see shared/members/_member -%li.member.group_member.py-2.px-3.d-flex.flex-column.flex-md-row{ id: dom_id } +%li.member.group_member.py-2.px-3.d-flex.flex-column.flex-md-row{ id: dom_id, data: { qa_selector: 'group_row' } } %span.list-item-name.mb-2.m-md-0 = group_icon(group, class: "avatar s40 flex-shrink-0 flex-grow-0", alt: '') .user-info @@ -41,7 +41,7 @@ - if can_admin_member = link_to project_group_link_path(@project, group_link), method: :delete, - data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name } }, + data: { confirm: _("Are you sure you want to remove %{group_name}?") % { group_name: group.name }, qa_selector: 'delete_group_access_link' }, class: 'btn btn-remove m-0 ml-sm-2 align-self-center' do %span.d-block.d-sm-none = _("Delete") diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index 6762f211a80..d5c1a1bee6d 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -8,7 +8,7 @@ -# Note this is just for individual members. For groups please see shared/members/_group -%li.member.py-2.px-3.d-flex.flex-column{ class: [dom_class(member), ("is-overridden" if override), ("flex-md-row" unless force_mobile_view)], id: dom_id(member) } +%li.member.py-2.px-3.d-flex.flex-column{ class: [dom_class(member), ("is-overridden" if override), ("flex-md-row" unless force_mobile_view)], id: dom_id(member), data: { qa_selector: 'member_row' } } %span.list-item-name.mb-2.m-md-0 - if user = image_tag avatar_icon_for_user(user, 40), class: "avatar s40 flex-shrink-0 flex-grow-0", alt: '' @@ -72,7 +72,7 @@ .member-form-control.dropdown{ class: [("mr-sm-2 d-sm-inline-block" unless force_mobile_view)] } %button.dropdown-menu-toggle.js-member-permissions-dropdown{ type: "button", disabled: member.can_override? && !override, - data: { toggle: "dropdown", field_name: "#{f.object_name}[access_level]" } } + data: { toggle: "dropdown", field_name: "#{f.object_name}[access_level]", qa_selector: "access_level_dropdown" } } %span.dropdown-toggle-text = member.human_access = icon("chevron-down") @@ -84,7 +84,7 @@ %li = link_to role, '#', class: ("is-active" if member.access_level == role_id), - data: { id: role_id, el_id: dom_id(member) } + data: { id: role_id, el_id: dom_id(member), qa_selector: "#{role.downcase}_access_level_link" } = render_if_exists 'shared/members/ee/revert_ldap_group_sync_option', group: @group, member: member, @@ -119,7 +119,7 @@ - else = link_to member, method: :delete, - data: { confirm: remove_member_message(member) }, + data: { confirm: remove_member_message(member), qa_selector: 'delete_member_button' }, class: "btn btn-remove align-self-center m-0 #{'ml-sm-2' unless force_mobile_view}", title: remove_member_title(member) do %span{ class: ('d-block d-sm-none' unless force_mobile_view) } diff --git a/app/workers/build_finished_worker.rb b/app/workers/build_finished_worker.rb index 8e2a18a8fd8..e95b6b38d28 100644 --- a/app/workers/build_finished_worker.rb +++ b/app/workers/build_finished_worker.rb @@ -34,3 +34,5 @@ class BuildFinishedWorker ChatNotificationWorker.perform_async(build.id) if build.pipeline.chat? end end + +BuildFinishedWorker.prepend_if_ee('EE::BuildFinishedWorker') diff --git a/app/workers/new_note_worker.rb b/app/workers/new_note_worker.rb index 1d1ea926c21..7648af3a8b9 100644 --- a/app/workers/new_note_worker.rb +++ b/app/workers/new_note_worker.rb @@ -23,3 +23,5 @@ class NewNoteWorker end # rubocop: enable CodeReuse/ActiveRecord end + +NewNoteWorker.prepend_if_ee('EE::NewNoteWorker') diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index 61d34981458..843ba3e980e 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -117,3 +117,5 @@ class PostReceive Gitlab::GitLogger.error("POST-RECEIVE: #{message}") end end + +PostReceive.prepend_if_ee('EE::PostReceive') diff --git a/app/workers/project_cache_worker.rb b/app/workers/project_cache_worker.rb index 5ac860c93e0..e3f1f61991c 100644 --- a/app/workers/project_cache_worker.rb +++ b/app/workers/project_cache_worker.rb @@ -3,7 +3,6 @@ # Worker for updating any project specific caches. class ProjectCacheWorker include ApplicationWorker - LEASE_TIMEOUT = 15.minutes.to_i # project_id - The ID of the project for which to flush the cache. @@ -55,3 +54,5 @@ class ProjectCacheWorker ["project_cache_worker", project_id, *statistics.sort].join(":") end end + +ProjectCacheWorker.prepend_if_ee('EE::ProjectCacheWorker') diff --git a/app/workers/repository_check/batch_worker.rb b/app/workers/repository_check/batch_worker.rb index c1bb1adc9cc..4091c30f498 100644 --- a/app/workers/repository_check/batch_worker.rb +++ b/app/workers/repository_check/batch_worker.rb @@ -2,6 +2,8 @@ module RepositoryCheck class BatchWorker + prepend_if_ee('::EE::RepositoryCheck::BatchWorker') # rubocop: disable Cop/InjectEnterpriseEditionModule + include ApplicationWorker include RepositoryCheckQueue include ExclusiveLeaseGuard diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb index a8097af321f..cadb1de356c 100644 --- a/app/workers/repository_check/single_repository_worker.rb +++ b/app/workers/repository_check/single_repository_worker.rb @@ -5,6 +5,8 @@ module RepositoryCheck include ApplicationWorker include RepositoryCheckQueue + prepend_if_ee('::EE::RepositoryCheck::SingleRepositoryWorker') # rubocop: disable Cop/InjectEnterpriseEditionModule + def perform(project_id) project = Project.find(project_id) healthy = project_healthy?(project) diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index dff9c8f50bf..5be439ecbc5 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -48,3 +48,5 @@ class RepositoryImportWorker project.gitlab_project_import? end end + +RepositoryImportWorker.prepend_if_ee('EE::RepositoryImportWorker') diff --git a/bin/elastic_repo_indexer b/bin/elastic_repo_indexer new file mode 100755 index 00000000000..3dfe0c4164b --- /dev/null +++ b/bin/elastic_repo_indexer @@ -0,0 +1,101 @@ +#!/usr/bin/env ruby + +require 'rubygems' +require 'bundler/setup' +require 'json' +require 'active_model' +require 'active_support' +require 'active_support/core_ext' +require 'benchmark' +require 'charlock_holmes' + +$: << File.expand_path('../lib', __dir__) +$: << File.expand_path('../ee/lib', __dir__) + +require 'open3' +require 'rugged' + +require 'gitlab/blob_helper' +require 'gitlab/elastic/client' +require 'elasticsearch/model' +require 'elasticsearch/git' +require 'elasticsearch/git/encoder_helper' +require 'elasticsearch/git/lite_blob' +require 'elasticsearch/git/model' +require 'elasticsearch/git/repository' + +Thread.abort_on_exception = true + +path_to_log_file = File.expand_path('../log/es-indexer.log', __dir__) +LOGGER = Logger.new(path_to_log_file) + +PROJECT_ID = ARGV.shift +REPO_PATH = ARGV.shift +FROM_SHA = ENV['FROM_SHA'] +TO_SHA = ENV['TO_SHA'] +RAILS_ENV = ENV['RAILS_ENV'] + +# Symbols get stringified when passed through JSON +elastic = {} +JSON.parse(ENV['ELASTIC_CONNECTION_INFO']).each { |k, v| elastic[k.to_sym] = v } +ELASTIC_CONFIG = elastic + +LOGGER.info("Has been scheduled for project #{REPO_PATH} with SHA range #{FROM_SHA}:#{TO_SHA}") + +class Repository + include Elasticsearch::Git::Repository + + index_name ['gitlab', RAILS_ENV].compact.join('-') + + def initialize + self.__elasticsearch__.client = ::Gitlab::Elastic::Client.build(ELASTIC_CONFIG) + end + + def client_for_indexing + self.__elasticsearch__.client + end + + def repository_id + PROJECT_ID + end + + def project_id + PROJECT_ID + end + + def path_to_repo + REPO_PATH + end +end + +repo = Repository.new + +params = { from_rev: FROM_SHA, to_rev: TO_SHA }.compact + +commit_thr = Thread.new do + LOGGER.info("Indexing commits started") + + timings = Benchmark.measure do + indexed = 0 + repo.index_commits(params) do |batch, total_count| + indexed += batch.length + LOGGER.info("Indexed #{indexed}/#{total_count} commits") + end + end + + LOGGER.info("Commits for #{REPO_PATH} are indexed. Time elapsed: #{timings.real}") +end + +LOGGER.info("Indexing blobs started") + +timings = Benchmark.measure do + indexed = 0 + repo.index_blobs(params) do |batch, total_count| + indexed += batch.length + LOGGER.info("Indexed #{indexed}/#{total_count} blobs") + end +end + +LOGGER.info("Blobs for #{REPO_PATH} are indexed. Time elapsed: #{timings.real}") + +commit_thr.join diff --git a/changelogs/unreleased/55095-show-cluster-on-job.yml b/changelogs/unreleased/55095-show-cluster-on-job.yml new file mode 100644 index 00000000000..818213e2519 --- /dev/null +++ b/changelogs/unreleased/55095-show-cluster-on-job.yml @@ -0,0 +1,5 @@ +--- +title: Show link to cluster used on job page +merge_request: 32446 +author: +type: added diff --git a/changelogs/unreleased/57783-better-indication-that-an-issue-has-been-duplicated.yml b/changelogs/unreleased/57783-better-indication-that-an-issue-has-been-duplicated.yml new file mode 100644 index 00000000000..20c5f80b7bf --- /dev/null +++ b/changelogs/unreleased/57783-better-indication-that-an-issue-has-been-duplicated.yml @@ -0,0 +1,5 @@ +--- +title: Indicate on Issue Status if an Issue was Duplicated +merge_request: 32472 +author: +type: changed diff --git a/changelogs/unreleased/61385-replace-vue-resource.yml b/changelogs/unreleased/61385-replace-vue-resource.yml index 787581b3f81..ef2366d078a 100644 --- a/changelogs/unreleased/61385-replace-vue-resource.yml +++ b/changelogs/unreleased/61385-replace-vue-resource.yml @@ -1,5 +1,5 @@ --- title: Replaced vue resource to axios in the Markdown field preview component -merge_request: 32742 +merge_request: 32386 author: Prakash Chokalingam @prakash_Chokalingam type: fixed diff --git a/changelogs/unreleased/ab-partial-events-index.yml b/changelogs/unreleased/ab-partial-events-index.yml new file mode 100644 index 00000000000..f68b0862c6b --- /dev/null +++ b/changelogs/unreleased/ab-partial-events-index.yml @@ -0,0 +1,5 @@ +--- +title: Replace events index with partial one +merge_request: 32874 +author: +type: performance diff --git a/changelogs/unreleased/ab-partial-index-for-namespaces-type.yml b/changelogs/unreleased/ab-partial-index-for-namespaces-type.yml new file mode 100644 index 00000000000..ad1802d5dce --- /dev/null +++ b/changelogs/unreleased/ab-partial-index-for-namespaces-type.yml @@ -0,0 +1,5 @@ +--- +title: Partial index for namespaces.type +merge_request: 32876 +author: +type: performance diff --git a/changelogs/unreleased/defect-ref-switcher-separators.yml b/changelogs/unreleased/defect-ref-switcher-separators.yml new file mode 100644 index 00000000000..56da52e5c54 --- /dev/null +++ b/changelogs/unreleased/defect-ref-switcher-separators.yml @@ -0,0 +1,5 @@ +--- +title: Fix ref switcher separators from conflicting with branch names +merge_request: 32198 +author: +type: fixed diff --git a/changelogs/unreleased/fj-66950-avoid-dns-checkings-domain-whitelisted.yml b/changelogs/unreleased/fj-66950-avoid-dns-checkings-domain-whitelisted.yml new file mode 100644 index 00000000000..0a1c5065208 --- /dev/null +++ b/changelogs/unreleased/fj-66950-avoid-dns-checkings-domain-whitelisted.yml @@ -0,0 +1,5 @@ +--- +title: Avoid dns rebinding checks when the domain is whitelisted +merge_request: 32603 +author: +type: changed diff --git a/changelogs/unreleased/generic-alertsettings-model.yml b/changelogs/unreleased/generic-alertsettings-model.yml new file mode 100644 index 00000000000..958323ce100 --- /dev/null +++ b/changelogs/unreleased/generic-alertsettings-model.yml @@ -0,0 +1,5 @@ +--- +title: Create table `alerts_service_data` +merge_request: 32860 +author: +type: added diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index dbbb7ba1b60..fbe6c21e53d 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -78,6 +78,7 @@ Gitlab.ee do Settings.smartcard['enabled'] = false if Settings.smartcard['enabled'].nil? Settings.smartcard['client_certificate_required_port'] = 3444 if Settings.smartcard['client_certificate_required_port'].nil? Settings.smartcard['required_for_git_access'] = false if Settings.smartcard['required_for_git_access'].nil? + Settings.smartcard['san_extensions'] = false if Settings.smartcard['san_extensions'].nil? end Settings['omniauth'] ||= Settingslogic.new({}) diff --git a/config/initializers/rack_attack_global.rb b/config/initializers/rack_attack_global.rb index 86cb930eca9..7f0439ef9bf 100644 --- a/config/initializers/rack_attack_global.rb +++ b/config/initializers/rack_attack_global.rb @@ -68,3 +68,5 @@ class Rack::Attack end end end + +::Rack::Attack::Request.prepend_if_ee('::EE::Gitlab::Rack::Attack::Request') diff --git a/config/initializers/workhorse_multipart.rb b/config/initializers/workhorse_multipart.rb index 4196e3a8f61..9c170d1adfa 100644 --- a/config/initializers/workhorse_multipart.rb +++ b/config/initializers/workhorse_multipart.rb @@ -1,5 +1,6 @@ Rails.application.configure do |config| - config.middleware.use(Gitlab::Middleware::Multipart) + # ApolloUploadServer::Middleware expects to find uploaded files ready to use + config.middleware.insert_before(ApolloUploadServer::Middleware, Gitlab::Middleware::Multipart) end # The Gitlab::Middleware::Multipart middleware inserts instances of our diff --git a/config/pseudonymizer.yml b/config/pseudonymizer.yml index 1d85ac1db45..8bbc69dca7d 100644 --- a/config/pseudonymizer.yml +++ b/config/pseudonymizer.yml @@ -98,6 +98,7 @@ tables: - weight - due_date - moved_to_id + - duplicated_to_id - lock_version - time_estimate - last_edited_at diff --git a/config/routes.rb b/config/routes.rb index 7d091576e8f..9dbcd7fffa2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -111,6 +111,7 @@ Rails.application.routes.draw do draw :smartcard draw :jira_connect draw :username + draw :trial draw :trial_registration draw :country end @@ -142,6 +143,7 @@ Rails.application.routes.draw do member do Gitlab.ee do get :metrics, format: :json + get '/prometheus/api/v1/*proxy_path', to: 'clusters#prometheus_proxy', as: :prometheus_api end scope :applications do diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000000..2861d34c941 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,20 @@ +project_identifier: 'gitlab-ee' +api_key_env: CROWDIN_API_KEY +preserve_hierarchy: true +commit_message: "[skip ci]" + +files: + - source: /locale/gitlab.pot + translation: /locale/%locale_with_underscore%/gitlab.po + languages_mapping: + locale_with_underscore: + bg: bg + de: de + eo: eo + es-ES: es + fr: fr + it: it + ja: ja + ko: ko + ru: ru + uk: uk diff --git a/db/migrate/20190830140240_add_duplicated_to_to_issue.rb b/db/migrate/20190830140240_add_duplicated_to_to_issue.rb new file mode 100644 index 00000000000..b38e4302a0b --- /dev/null +++ b/db/migrate/20190830140240_add_duplicated_to_to_issue.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class AddDuplicatedToToIssue < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_column :issues, :duplicated_to_id, :integer unless duplicated_to_id_exists? + add_concurrent_foreign_key :issues, :issues, column: :duplicated_to_id, on_delete: :nullify + add_concurrent_index :issues, :duplicated_to_id, where: 'duplicated_to_id IS NOT NULL' + end + + def down + remove_foreign_key_without_error(:issues, column: :duplicated_to_id) + remove_concurrent_index(:issues, :duplicated_to_id) + remove_column(:issues, :duplicated_to_id) if duplicated_to_id_exists? + end + + private + + def duplicated_to_id_exists? + column_exists?(:issues, :duplicated_to_id) + end +end diff --git a/db/migrate/20190906104555_create_alerts_service_data.rb b/db/migrate/20190906104555_create_alerts_service_data.rb new file mode 100644 index 00000000000..8ce447a67d1 --- /dev/null +++ b/db/migrate/20190906104555_create_alerts_service_data.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class CreateAlertsServiceData < ActiveRecord::Migration[5.2] + DOWNTIME = false + + def change + create_table :alerts_service_data do |t| + t.references :service, type: :integer, index: true, null: false, + foreign_key: { on_delete: :cascade } + t.timestamps_with_timezone + t.string :encrypted_token, limit: 255 + t.string :encrypted_token_iv, limit: 255 + end + end +end diff --git a/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb b/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb new file mode 100644 index 00000000000..40a7454fd20 --- /dev/null +++ b/db/migrate/20190910103144_replace_events_index_on_group_id_with_partial_index.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class ReplaceEventsIndexOnGroupIdWithPartialIndex < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index(:events, :group_id, where: 'group_id IS NOT NULL', name: 'index_events_on_group_id_partial') + remove_concurrent_index_by_name(:events, 'index_events_on_group_id') + end + + def down + add_concurrent_index(:events, :group_id, name: 'index_events_on_group_id') + remove_concurrent_index_by_name(:events, 'index_events_on_group_id_partial') + end +end diff --git a/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb b/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb new file mode 100644 index 00000000000..8237c48b16d --- /dev/null +++ b/db/migrate/20190910114843_exclude_nulls_from_index_on_namespaces_type.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class ExcludeNullsFromIndexOnNamespacesType < ActiveRecord::Migration[5.1] + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index(:namespaces, :type, where: 'type is not null', name: 'index_namespaces_on_type_partial') + remove_concurrent_index_by_name(:namespaces, 'index_namespaces_on_type') + end + + def down + add_concurrent_index(:namespaces, :type, name: 'index_namespaces_on_type') + remove_concurrent_index_by_name(:namespaces, 'index_namespaces_on_type_partial') + end +end diff --git a/db/schema.rb b/db/schema.rb index 39faf1e651e..95069f711fb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -26,6 +26,15 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "cached_markdown_version" end + create_table "alerts_service_data", force: :cascade do |t| + t.integer "service_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.string "encrypted_token", limit: 255 + t.string "encrypted_token_iv", limit: 255 + t.index ["service_id"], name: "index_alerts_service_data_on_service_id" + end + create_table "allowed_email_domains", force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -75,8 +84,9 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "appearances", id: :serial, force: :cascade do |t| t.string "title", null: false t.text "description", null: false - t.string "header_logo" t.string "logo" + t.integer "updated_by" + t.string "header_logo" t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.text "description_html" @@ -91,7 +101,6 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.text "message_font_color" t.string "favicon" t.boolean "email_header_and_footer_enabled", default: false, null: false - t.integer "updated_by" end create_table "application_setting_terms", id: :serial, force: :cascade do |t| @@ -241,6 +250,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "pseudonymizer_enabled", default: false, null: false t.boolean "hide_third_party_offers", default: false, null: false t.boolean "snowplow_enabled", default: false, null: false + t.string "snowplow_collector_hostname" t.string "snowplow_site_id" t.string "snowplow_cookie_domain" t.boolean "instance_statistics_visibility_private", default: false, null: false @@ -278,7 +288,6 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "allow_local_requests_from_web_hooks_and_services", default: false, null: false t.boolean "allow_local_requests_from_system_hooks", default: true, null: false t.bigint "instance_administration_project_id" - t.string "snowplow_collector_hostname" t.boolean "asset_proxy_enabled", default: false, null: false t.string "asset_proxy_url" t.text "asset_proxy_whitelist" @@ -533,8 +542,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "ci_build_trace_sections", id: :serial, force: :cascade do |t| t.integer "project_id", null: false - t.datetime_with_timezone "date_start", null: false - t.datetime_with_timezone "date_end", null: false + t.datetime "date_start", null: false + t.datetime "date_end", null: false t.bigint "byte_start", null: false t.bigint "byte_end", null: false t.integer "build_id", null: false @@ -656,12 +665,12 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "project_id", null: false t.integer "job_id", null: false t.integer "file_type", null: false - t.integer "file_store" t.bigint "size" t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.datetime_with_timezone "expire_at" t.string "file" + t.integer "file_store" t.binary "file_sha256" t.integer "file_format", limit: 2 t.integer "file_location", limit: 2 @@ -690,7 +699,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.index ["pipeline_id"], name: "index_ci_pipeline_chat_data_on_pipeline_id", unique: true end - create_table "ci_pipeline_schedule_variables", force: :cascade do |t| + create_table "ci_pipeline_schedule_variables", id: :serial, force: :cascade do |t| t.string "key", null: false t.text "value" t.text "encrypted_value" @@ -889,8 +898,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "cluster_platforms_kubernetes", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.text "api_url" t.text "ca_cert" t.string "namespace" @@ -906,8 +915,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "cluster_projects", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "cluster_id", null: false - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["cluster_id"], name: "index_cluster_projects_on_cluster_id" t.index ["project_id"], name: "index_cluster_projects_on_project_id" end @@ -916,8 +925,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "cluster_id", null: false t.integer "status" t.integer "num_nodes", null: false - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.text "status_reason" t.string "gcp_project_id", null: false t.string "zone", null: false @@ -934,8 +943,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "user_id" t.integer "provider_type" t.integer "platform_type" - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.boolean "enabled", default: true t.string "name", null: false t.string "environment_scope", default: "*", null: false @@ -960,8 +969,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "clusters_applications_helm", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "status", null: false t.string "version", null: false t.text "status_reason" @@ -973,8 +982,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "clusters_applications_ingress", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "status", null: false t.integer "ingress_type", null: false t.string "version", null: false @@ -1018,9 +1027,9 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.text "status_reason" t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false + t.datetime_with_timezone "last_update_started_at" t.string "encrypted_alert_manager_token" t.string "encrypted_alert_manager_token_iv" - t.datetime_with_timezone "last_update_started_at" t.index ["cluster_id"], name: "index_clusters_applications_prometheus_on_cluster_id", unique: true end @@ -1101,21 +1110,21 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do end create_table "dependency_proxy_blobs", id: :serial, force: :cascade do |t| - t.datetime_with_timezone "created_at", null: false - t.text "file", null: false - t.string "file_name", null: false - t.integer "file_store" t.integer "group_id", null: false - t.bigint "size" + t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false + t.bigint "size" + t.integer "file_store" + t.string "file_name", null: false + t.text "file", null: false t.index ["group_id", "file_name"], name: "index_dependency_proxy_blobs_on_group_id_and_file_name" end create_table "dependency_proxy_group_settings", id: :serial, force: :cascade do |t| - t.datetime_with_timezone "created_at", null: false - t.boolean "enabled", default: false, null: false t.integer "group_id", null: false + t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false + t.boolean "enabled", default: false, null: false t.index ["group_id"], name: "index_dependency_proxy_group_settings_on_group_id" end @@ -1231,8 +1240,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.datetime "created_at" t.datetime "updated_at" t.string "confirmation_token" - t.datetime_with_timezone "confirmed_at" - t.datetime_with_timezone "confirmation_sent_at" + t.datetime "confirmed_at" + t.datetime "confirmation_sent_at" t.index ["confirmation_token"], name: "index_emails_on_confirmation_token", unique: true t.index ["email"], name: "index_emails_on_email", unique: true t.index ["user_id"], name: "index_emails_on_user_id" @@ -1321,7 +1330,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.index ["action"], name: "index_events_on_action" t.index ["author_id", "project_id"], name: "index_events_on_author_id_and_project_id" t.index ["created_at", "author_id"], name: "analytics_index_events_on_created_at_and_author_id" - t.index ["group_id"], name: "index_events_on_group_id" + t.index ["group_id"], name: "index_events_on_group_id_partial", where: "(group_id IS NOT NULL)" t.index ["project_id", "created_at"], name: "index_events_on_project_id_and_created_at" t.index ["project_id", "id"], name: "index_events_on_project_id_and_id" t.index ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id" @@ -1679,8 +1688,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" - t.integer "saml_provider_id" t.string "secondary_extern_uid" + t.integer "saml_provider_id" t.index "lower((extern_uid)::text), provider", name: "index_on_identities_lower_extern_uid_and_provider" t.index ["saml_provider_id"], name: "index_identities_on_saml_provider_id", where: "(saml_provider_id IS NOT NULL)" t.index ["user_id"], name: "index_identities_on_user_id" @@ -1782,6 +1791,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "state" t.integer "iid" t.integer "updated_by_id" + t.integer "weight" t.boolean "confidential", default: false, null: false t.date "due_date" t.integer "moved_to_id" @@ -1790,6 +1800,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.text "description_html" t.integer "time_estimate" t.integer "relative_position" + t.string "service_desk_reply_to" t.integer "cached_markdown_version" t.datetime "last_edited_at" t.integer "last_edited_by_id" @@ -1797,12 +1808,12 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.datetime_with_timezone "closed_at" t.integer "closed_by_id" t.integer "state_id", limit: 2 - t.string "service_desk_reply_to" - t.integer "weight" + t.integer "duplicated_to_id" t.index ["author_id"], name: "index_issues_on_author_id" t.index ["closed_by_id"], name: "index_issues_on_closed_by_id" t.index ["confidential"], name: "index_issues_on_confidential" t.index ["description"], name: "index_issues_on_description_trigram", opclass: :gin_trgm_ops, using: :gin + t.index ["duplicated_to_id"], name: "index_issues_on_duplicated_to_id", where: "(duplicated_to_id IS NOT NULL)" t.index ["milestone_id"], name: "index_issues_on_milestone_id" t.index ["moved_to_id"], name: "index_issues_on_moved_to_id", where: "(moved_to_id IS NOT NULL)" t.index ["project_id", "created_at", "id", "state"], name: "index_issues_on_project_id_and_created_at_and_id_and_state" @@ -1826,9 +1837,9 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do end create_table "jira_connect_subscriptions", force: :cascade do |t| - t.datetime_with_timezone "created_at", null: false t.bigint "jira_connect_installation_id", null: false t.integer "namespace_id", null: false + t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.index ["jira_connect_installation_id", "namespace_id"], name: "idx_jira_connect_subscriptions_on_installation_id_namespace_id", unique: true t.index ["jira_connect_installation_id"], name: "idx_jira_connect_subscriptions_on_installation_id" @@ -1970,8 +1981,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "position" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "milestone_id" t.integer "user_id" + t.integer "milestone_id" t.index ["board_id", "label_id"], name: "index_lists_on_board_id_and_label_id", unique: true t.index ["label_id"], name: "index_lists_on_label_id" t.index ["list_type"], name: "index_lists_on_list_type" @@ -2023,8 +2034,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do end create_table "merge_request_diff_commits", id: false, force: :cascade do |t| - t.datetime_with_timezone "authored_date" - t.datetime_with_timezone "committed_date" + t.datetime "authored_date" + t.datetime "committed_date" t.integer "merge_request_diff_id", null: false t.integer "relative_order", null: false t.binary "sha", null: false @@ -2120,11 +2131,14 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "merge_when_pipeline_succeeds", default: false, null: false t.integer "merge_user_id" t.string "merge_commit_sha" + t.integer "approvals_before_merge" + t.string "rebase_commit_sha" t.string "in_progress_merge_commit_sha" t.integer "lock_version" t.text "title_html" t.text "description_html" t.integer "time_estimate" + t.boolean "squash", default: false, null: false t.integer "cached_markdown_version" t.datetime "last_edited_at" t.integer "last_edited_by_id" @@ -2132,11 +2146,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "merge_jid" t.boolean "discussion_locked" t.integer "latest_merge_request_diff_id" - t.string "rebase_commit_sha" - t.boolean "squash", default: false, null: false t.boolean "allow_maintainer_to_push" t.integer "state_id", limit: 2 - t.integer "approvals_before_merge" t.string "rebase_jid" t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id" t.index ["author_id"], name: "index_merge_requests_on_author_id" @@ -2243,34 +2254,34 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "type" t.string "description", default: "", null: false t.string "avatar" + t.boolean "membership_lock", default: false t.boolean "share_with_group_lock", default: false t.integer "visibility_level", default: 20, null: false t.boolean "request_access_enabled", default: false, null: false + t.string "ldap_sync_status", default: "ready", null: false + t.string "ldap_sync_error" + t.datetime "ldap_sync_last_update_at" + t.datetime "ldap_sync_last_successful_update_at" + t.datetime "ldap_sync_last_sync_at" t.text "description_html" t.boolean "lfs_enabled" t.integer "parent_id" + t.integer "shared_runners_minutes_limit" + t.bigint "repository_size_limit" t.boolean "require_two_factor_authentication", default: false, null: false t.integer "two_factor_grace_period", default: 48, null: false t.integer "cached_markdown_version" - t.string "runners_token" - t.string "runners_token_encrypted" + t.integer "plan_id" t.integer "project_creation_level" - t.boolean "auto_devops_enabled" - t.datetime_with_timezone "last_ci_minutes_notification_at" - t.integer "custom_project_templates_group_id" + t.string "runners_token" + t.datetime_with_timezone "trial_ends_on" t.integer "file_template_project_id" - t.string "ldap_sync_error" - t.datetime "ldap_sync_last_successful_update_at" - t.datetime "ldap_sync_last_sync_at" - t.datetime "ldap_sync_last_update_at" - t.integer "plan_id" - t.bigint "repository_size_limit" t.string "saml_discovery_token" - t.integer "shared_runners_minutes_limit" - t.datetime_with_timezone "trial_ends_on" + t.string "runners_token_encrypted" + t.integer "custom_project_templates_group_id" + t.boolean "auto_devops_enabled" t.integer "extra_shared_runners_minutes_limit" - t.string "ldap_sync_status", default: "ready", null: false - t.boolean "membership_lock", default: false + t.datetime_with_timezone "last_ci_minutes_notification_at" t.integer "last_ci_minutes_usage_notification_level" t.integer "subgroup_creation_level", default: 1 t.boolean "emails_disabled" @@ -2291,7 +2302,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.index ["runners_token_encrypted"], name: "index_namespaces_on_runners_token_encrypted", unique: true t.index ["shared_runners_minutes_limit", "extra_shared_runners_minutes_limit"], name: "index_namespaces_on_shared_and_extra_runners_minutes_limit" t.index ["trial_ends_on"], name: "index_namespaces_on_trial_ends_on", where: "(trial_ends_on IS NOT NULL)" - t.index ["type"], name: "index_namespaces_on_type" + t.index ["type"], name: "index_namespaces_on_type_partial", where: "(type IS NOT NULL)" end create_table "note_diff_files", id: :serial, force: :cascade do |t| @@ -2365,8 +2376,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "success_pipeline" t.boolean "push_to_merge_request" t.boolean "issue_due" - t.string "notification_email" t.boolean "new_epic" + t.string "notification_email" t.index ["source_id", "source_type"], name: "index_notification_settings_on_source_id_and_source_type" t.index ["user_id", "source_id", "source_type"], name: "index_notifications_on_user_id_and_source_id_and_source_type", unique: true t.index ["user_id"], name: "index_notification_settings_on_user_id" @@ -2702,15 +2713,15 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do create_table "project_mirror_data", id: :serial, force: :cascade do |t| t.integer "project_id", null: false + t.integer "retry_count", default: 0, null: false + t.datetime "last_update_started_at" + t.datetime "last_update_scheduled_at" + t.datetime "next_execution_timestamp" t.string "status" t.string "jid" t.text "last_error" - t.datetime_with_timezone "last_successful_update_at" t.datetime_with_timezone "last_update_at" - t.datetime "last_update_scheduled_at" - t.datetime "last_update_started_at" - t.datetime "next_execution_timestamp" - t.integer "retry_count", default: 0, null: false + t.datetime_with_timezone "last_successful_update_at" t.index ["jid"], name: "index_project_mirror_data_on_jid" t.index ["last_successful_update_at"], name: "index_project_mirror_data_on_last_successful_update_at" t.index ["last_update_at", "retry_count"], name: "index_project_mirror_data_on_last_update_at_and_retry_count" @@ -2756,10 +2767,10 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.bigint "repository_size", default: 0, null: false t.bigint "lfs_objects_size", default: 0, null: false t.bigint "build_artifacts_size", default: 0, null: false - t.bigint "packages_size", default: 0, null: false - t.bigint "wiki_size" t.bigint "shared_runners_seconds", default: 0, null: false t.datetime "shared_runners_seconds_last_reset" + t.bigint "packages_size", default: 0, null: false + t.bigint "wiki_size" t.index ["namespace_id"], name: "index_project_statistics_on_namespace_id" t.index ["project_id"], name: "index_project_statistics_on_project_id", unique: true end @@ -2785,14 +2796,25 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "visibility_level", default: 0, null: false t.boolean "archived", default: false, null: false t.string "avatar" + t.text "merge_requests_template" t.integer "star_count", default: 0, null: false + t.boolean "merge_requests_rebase_enabled", default: false t.string "import_type" t.string "import_source" + t.integer "approvals_before_merge", default: 0, null: false + t.boolean "reset_approvals_on_push", default: true + t.boolean "merge_requests_ff_only_enabled", default: false + t.text "issues_template" + t.boolean "mirror", default: false, null: false + t.datetime "mirror_last_update_at" + t.datetime "mirror_last_successful_update_at" + t.integer "mirror_user_id" t.boolean "shared_runners_enabled", default: true, null: false t.string "runners_token" t.string "build_coverage_regex" t.boolean "build_allow_git_fetch", default: true, null: false t.integer "build_timeout", default: 3600, null: false + t.boolean "mirror_trigger_builds", default: false, null: false t.boolean "pending_delete", default: false t.boolean "public_builds", default: true, null: false t.boolean "last_repository_check_failed" @@ -2801,51 +2823,40 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "only_allow_merge_if_pipeline_succeeds", default: false, null: false t.boolean "has_external_issue_tracker" t.string "repository_storage", default: "default", null: false + t.boolean "repository_read_only" t.boolean "request_access_enabled", default: false, null: false t.boolean "has_external_wiki" t.string "ci_config_path" t.boolean "lfs_enabled" t.text "description_html" t.boolean "only_allow_merge_if_all_discussions_are_resolved" + t.bigint "repository_size_limit" t.boolean "printing_merge_request_link_enabled", default: true, null: false t.integer "auto_cancel_pending_pipelines", default: 1, null: false + t.boolean "service_desk_enabled", default: true t.integer "cached_markdown_version" t.text "delete_error" t.datetime "last_repository_updated_at" + t.boolean "disable_overriding_approvers_per_merge_request" t.integer "storage_version", limit: 2 t.boolean "resolve_outdated_diff_discussions" - t.boolean "repository_read_only" - t.boolean "merge_requests_ff_only_enabled", default: false - t.boolean "merge_requests_rebase_enabled", default: false + t.boolean "remote_mirror_available_overridden" + t.boolean "only_mirror_protected_branches" + t.boolean "pull_mirror_available_overridden" t.integer "jobs_cache_index" + t.string "external_authorization_classification_label" + t.boolean "mirror_overwrites_diverged_branches" t.boolean "pages_https_only", default: true - t.boolean "remote_mirror_available_overridden" + t.string "external_webhook_token" + t.boolean "packages_enabled" + t.boolean "merge_requests_author_approval" t.bigint "pool_repository_id" t.string "runners_token_encrypted" t.string "bfg_object_map" + t.boolean "merge_requests_require_code_owner_approval" t.boolean "detected_repository_languages" - t.string "external_authorization_classification_label" - t.boolean "disable_overriding_approvers_per_merge_request" - t.string "external_webhook_token" - t.text "issues_template" - t.boolean "merge_requests_author_approval" t.boolean "merge_requests_disable_committers_approval" - t.boolean "merge_requests_require_code_owner_approval" - t.text "merge_requests_template" - t.datetime "mirror_last_successful_update_at" - t.datetime "mirror_last_update_at" - t.boolean "mirror_overwrites_diverged_branches" - t.integer "mirror_user_id" - t.boolean "only_mirror_protected_branches" - t.boolean "packages_enabled" - t.boolean "pull_mirror_available_overridden" - t.bigint "repository_size_limit" t.boolean "require_password_to_approve" - t.boolean "mirror", default: false, null: false - t.boolean "mirror_trigger_builds", default: false, null: false - t.boolean "reset_approvals_on_push", default: true - t.boolean "service_desk_enabled", default: true - t.integer "approvals_before_merge", default: 0, null: false t.boolean "emails_disabled" t.index ["archived", "pending_delete", "merge_requests_require_code_owner_approval"], name: "projects_requiring_code_owner_approval", where: "((pending_delete = false) AND (archived = false) AND (merge_requests_require_code_owner_approval = true))" t.index ["created_at"], name: "index_projects_on_created_at" @@ -2921,8 +2932,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "access_level", default: 40 t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "group_id" t.integer "user_id" + t.integer "group_id" t.index ["group_id"], name: "index_protected_branch_merge_access_levels_on_group_id" t.index ["protected_branch_id"], name: "index_protected_branch_merge_access" t.index ["user_id"], name: "index_protected_branch_merge_access_levels_on_user_id" @@ -2933,8 +2944,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "access_level", default: 40 t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "group_id" t.integer "user_id" + t.integer "group_id" t.index ["group_id"], name: "index_protected_branch_push_access_levels_on_group_id" t.index ["protected_branch_id"], name: "index_protected_branch_push_access" t.index ["user_id"], name: "index_protected_branch_push_access_levels_on_user_id" @@ -3080,15 +3091,15 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "update_status" t.datetime "last_update_at" t.datetime "last_successful_update_at" - t.datetime "last_update_started_at" t.string "last_error" - t.boolean "only_protected_branches", default: false, null: false - t.string "remote_name" t.text "encrypted_credentials" t.string "encrypted_credentials_iv" t.string "encrypted_credentials_salt" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.datetime "last_update_started_at" + t.boolean "only_protected_branches", default: false, null: false + t.string "remote_name" t.boolean "error_notification_sent" t.index ["last_successful_update_at"], name: "index_remote_mirrors_on_last_successful_update_at" t.index ["project_id"], name: "index_remote_mirrors_on_project_id" @@ -3105,13 +3116,13 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "action", null: false t.integer "issue_id" t.integer "merge_request_id" + t.integer "epic_id" t.integer "label_id" t.integer "user_id" t.datetime_with_timezone "created_at", null: false t.integer "cached_markdown_version" t.text "reference" t.text "reference_html" - t.integer "epic_id" t.index ["epic_id"], name: "index_resource_label_events_on_epic_id" t.index ["issue_id"], name: "index_resource_label_events_on_issue_id" t.index ["label_id"], name: "index_resource_label_events_on_label_id" @@ -3350,7 +3361,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.datetime "updated_at", null: false t.integer "issue_id" t.integer "merge_request_id" - t.datetime_with_timezone "spent_at" + t.datetime "spent_at" t.index ["issue_id"], name: "index_timelogs_on_issue_id" t.index ["merge_request_id"], name: "index_timelogs_on_merge_request_id" t.index ["user_id"], name: "index_timelogs_on_user_id" @@ -3406,9 +3417,9 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "model_type" t.string "uploader", null: false t.datetime "created_at", null: false + t.integer "store" t.string "mount_point" t.string "secret" - t.integer "store" t.index ["checksum"], name: "index_uploads_on_checksum" t.index ["model_id", "model_type"], name: "index_uploads_on_model_id_and_model_type" t.index ["store"], name: "index_uploads_on_store" @@ -3434,8 +3445,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do end create_table "user_custom_attributes", id: :serial, force: :cascade do |t| - t.datetime_with_timezone "created_at", null: false - t.datetime_with_timezone "updated_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.integer "user_id", null: false t.string "key", null: false t.string "value", null: false @@ -3456,16 +3467,16 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "merge_request_notes_filter", limit: 2, default: 0, null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false - t.integer "first_day_of_week" + t.string "epics_sort" + t.integer "roadmap_epics_state" + t.integer "epic_notes_filter", limit: 2, default: 0, null: false t.string "issues_sort" t.string "merge_requests_sort" + t.string "roadmaps_sort" + t.integer "first_day_of_week" t.string "timezone" t.boolean "time_display_relative" t.boolean "time_format_in_24h" - t.integer "epic_notes_filter", limit: 2, default: 0, null: false - t.string "epics_sort" - t.integer "roadmap_epics_state" - t.string "roadmaps_sort" t.string "projects_sort", limit: 64 t.index ["user_id"], name: "index_user_preferences_on_user_id", unique: true end @@ -3524,6 +3535,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "unconfirmed_email" t.boolean "hide_no_ssh_key", default: false t.string "website_url", default: "", null: false + t.datetime "admin_email_unsubscribed_at" t.string "notification_email" t.boolean "hide_no_password", default: false t.boolean "password_automatically_set", default: false @@ -3539,33 +3551,32 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.integer "consumed_timestep" t.integer "layout", default: 0 t.boolean "hide_project_limit", default: false + t.text "note" t.string "unlock_token" t.datetime "otp_grace_period_started_at" t.boolean "external", default: false t.string "incoming_email_token" t.string "organization" + t.boolean "auditor", default: false, null: false t.boolean "require_two_factor_authentication_from_group", default: false, null: false t.integer "two_factor_grace_period", default: 48, null: false t.boolean "ghost" t.date "last_activity_on" t.boolean "notified_of_own_activity" t.string "preferred_language" + t.boolean "email_opted_in" + t.string "email_opted_in_ip" + t.integer "email_opted_in_source_id" + t.datetime "email_opted_in_at" t.integer "theme_id", limit: 2 t.integer "accepted_term_id" t.string "feed_token" t.boolean "private_profile", default: false, null: false + t.integer "roadmap_layout", limit: 2 t.boolean "include_private_contributions" t.string "commit_email" - t.boolean "auditor", default: false, null: false - t.datetime "admin_email_unsubscribed_at" - t.boolean "email_opted_in" - t.datetime "email_opted_in_at" - t.string "email_opted_in_ip" - t.integer "email_opted_in_source_id" t.integer "group_view" t.integer "managing_group_id" - t.text "note" - t.integer "roadmap_layout", limit: 2 t.integer "bot_type", limit: 2 t.string "first_name", limit: 255 t.string "last_name", limit: 255 @@ -3722,6 +3733,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.boolean "issues_events", default: false, null: false t.boolean "merge_requests_events", default: false, null: false t.boolean "tag_push_events", default: false + t.integer "group_id" t.boolean "note_events", default: false, null: false t.boolean "enable_ssl_verification", default: true t.boolean "wiki_page_events", default: false, null: false @@ -3735,11 +3747,11 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do t.string "encrypted_token_iv" t.string "encrypted_url" t.string "encrypted_url_iv" - t.integer "group_id" t.index ["project_id"], name: "index_web_hooks_on_project_id" t.index ["type"], name: "index_web_hooks_on_type" end + add_foreign_key "alerts_service_data", "services", on_delete: :cascade add_foreign_key "allowed_email_domains", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "analytics_cycle_analytics_group_stages", "labels", column: "end_event_label_id", on_delete: :cascade add_foreign_key "analytics_cycle_analytics_group_stages", "labels", column: "start_event_label_id", on_delete: :cascade @@ -3779,7 +3791,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "board_project_recent_visits", "boards", on_delete: :cascade add_foreign_key "board_project_recent_visits", "projects", on_delete: :cascade add_foreign_key "board_project_recent_visits", "users", on_delete: :cascade - add_foreign_key "boards", "namespaces", column: "group_id", on_delete: :cascade + add_foreign_key "boards", "namespaces", column: "group_id", name: "fk_1e9a074a35", 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_needs", "ci_builds", column: "build_id", on_delete: :cascade @@ -3834,7 +3846,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "clusters", "users", on_delete: :nullify add_foreign_key "clusters_applications_cert_managers", "clusters", on_delete: :cascade add_foreign_key "clusters_applications_helm", "clusters", on_delete: :cascade - add_foreign_key "clusters_applications_ingress", "clusters", name: "fk_753a7b41c1", on_delete: :cascade + add_foreign_key "clusters_applications_ingress", "clusters", on_delete: :cascade add_foreign_key "clusters_applications_jupyter", "clusters", on_delete: :cascade add_foreign_key "clusters_applications_jupyter", "oauth_applications", on_delete: :nullify add_foreign_key "clusters_applications_knative", "clusters", on_delete: :cascade @@ -3846,8 +3858,8 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "clusters_kubernetes_namespaces", "environments", on_delete: :nullify add_foreign_key "clusters_kubernetes_namespaces", "projects", on_delete: :nullify add_foreign_key "container_repositories", "projects" - add_foreign_key "dependency_proxy_blobs", "namespaces", column: "group_id", name: "fk_db58bbc5d7", on_delete: :cascade - add_foreign_key "dependency_proxy_group_settings", "namespaces", column: "group_id", name: "fk_616ddd680a", on_delete: :cascade + add_foreign_key "dependency_proxy_blobs", "namespaces", column: "group_id", on_delete: :cascade + add_foreign_key "dependency_proxy_group_settings", "namespaces", column: "group_id", on_delete: :cascade add_foreign_key "deploy_keys_projects", "projects", name: "fk_58a901ca7e", on_delete: :cascade add_foreign_key "deployments", "clusters", name: "fk_289bba3222", on_delete: :nullify add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade @@ -3924,14 +3936,15 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "issue_links", "issues", column: "target_id", name: "fk_e71bb44f1f", on_delete: :cascade add_foreign_key "issue_metrics", "issues", on_delete: :cascade add_foreign_key "issue_tracker_data", "services", on_delete: :cascade + add_foreign_key "issues", "issues", column: "duplicated_to_id", name: "fk_9c4516d665", on_delete: :nullify add_foreign_key "issues", "issues", column: "moved_to_id", name: "fk_a194299be1", on_delete: :nullify add_foreign_key "issues", "milestones", name: "fk_96b1dd429c", on_delete: :nullify add_foreign_key "issues", "projects", name: "fk_899c8f3231", on_delete: :cascade add_foreign_key "issues", "users", column: "author_id", name: "fk_05f1e72feb", on_delete: :nullify add_foreign_key "issues", "users", column: "closed_by_id", name: "fk_c63cbf6c25", on_delete: :nullify add_foreign_key "issues", "users", column: "updated_by_id", name: "fk_ffed080f01", on_delete: :nullify - add_foreign_key "jira_connect_subscriptions", "jira_connect_installations", name: "fk_f1d617343f", on_delete: :cascade - add_foreign_key "jira_connect_subscriptions", "namespaces", name: "fk_a3c10bcf7d", on_delete: :cascade + add_foreign_key "jira_connect_subscriptions", "jira_connect_installations", on_delete: :cascade + add_foreign_key "jira_connect_subscriptions", "namespaces", on_delete: :cascade add_foreign_key "jira_tracker_data", "services", on_delete: :cascade add_foreign_key "label_links", "labels", name: "fk_d97dd08678", on_delete: :cascade add_foreign_key "label_priorities", "labels", on_delete: :cascade @@ -4018,7 +4031,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "project_import_data", "projects", name: "fk_ffb9ee3a10", on_delete: :cascade add_foreign_key "project_incident_management_settings", "projects", on_delete: :cascade add_foreign_key "project_metrics_settings", "projects", on_delete: :cascade - add_foreign_key "project_mirror_data", "projects", on_delete: :cascade + add_foreign_key "project_mirror_data", "projects", name: "fk_d1aad367d7", on_delete: :cascade add_foreign_key "project_repositories", "projects", on_delete: :cascade add_foreign_key "project_repositories", "shards", on_delete: :restrict add_foreign_key "project_repository_states", "projects", on_delete: :cascade @@ -4054,7 +4067,7 @@ ActiveRecord::Schema.define(version: 2019_09_12_061145) do add_foreign_key "release_links", "releases", on_delete: :cascade add_foreign_key "releases", "projects", name: "fk_47fe2a0596", on_delete: :cascade add_foreign_key "releases", "users", column: "author_id", name: "fk_8e4456f90f", on_delete: :nullify - add_foreign_key "remote_mirrors", "projects", on_delete: :cascade + add_foreign_key "remote_mirrors", "projects", name: "fk_43a9aa4ca8", on_delete: :cascade add_foreign_key "repository_languages", "projects", on_delete: :cascade add_foreign_key "resource_label_events", "epics", on_delete: :cascade add_foreign_key "resource_label_events", "issues", on_delete: :cascade diff --git a/doc/administration/raketasks/geo.md b/doc/administration/raketasks/geo.md index 691d34ab7fa..387bc71965b 100644 --- a/doc/administration/raketasks/geo.md +++ b/doc/administration/raketasks/geo.md @@ -55,3 +55,20 @@ sudo gitlab-rake geo:git:housekeeping:gc ```bash sudo -u git -H bundle exec rake geo:git:housekeeping:gc RAILS_ENV=production ``` + +## Remove orphaned project registries + +Under certain conditions your project registry can contain obsolete records, you +can remove them using the rake task `geo:run_orphaned_project_registry_cleaner`: + +**Omnibus Installation** + +``` +sudo gitlab-rake geo:run_orphaned_project_registry_cleaner +``` + +**Source Installation** + +```bash +sudo -u git -H bundle exec rake geo:run_orphaned_project_registry_cleaner RAILS_ENV=production +``` diff --git a/doc/user/clusters/environments.md b/doc/user/clusters/environments.md new file mode 100644 index 00000000000..4aef871af55 --- /dev/null +++ b/doc/user/clusters/environments.md @@ -0,0 +1,47 @@ +# Cluster Environments **(PREMIUM)** + +> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/13392) in [GitLab Premium](https://about.gitlab.com/pricing/) 12.3. + +Cluster environments provide a consolidated view of which CI [environments](../../ci/environments.md) are +deployed to the Kubernetes cluster and it: + +- Shows the project and the relevant environment related to the deployment. +- Displays the status of the pods for that environment. + +## Overview + +NOTE: **Note:** +Cluster environments are only available for +[group-level clusters](../group/clusters/index.md). +Support for [instance-level](../instance/clusters/index.md) clusters is +[planned](https://gitlab.com/gitlab-org/gitlab-ce/issues/63985). + +With cluster environments, you can gain insight into: + +- Which projects are deployed to the cluster. +- How many pods are in use for each project's environment. +- The CI job that was used to deploy to that environment. + +![Cluster environments page](img/cluster_environments_table_v12_3.png) + +Access to cluster environments is restricted to [group maintainers and +owners](../permissions.md#group-members-permissions) + +## Usage + +In order to: + +- Track environments for the cluster, you must + [deploy to a Kubernetes cluster](../project/clusters/index.md#deploying-to-a-kubernetes-cluster) + successfully. +- Show pod usage correctly, you must + [enable Deploy Boards](../project/deploy_boards.md#enabling-deploy-boards). + +Once you have successful deployments to your group-level cluster: + +1. Navigate to your group's **Kubernetes** page. +1. Click on the **Environments** tab. + +NOTE: **Note:** +Only successful deployments to the cluster is included in this page. +Non-cluster environments will not be included. diff --git a/doc/user/clusters/img/cluster_environments_table_v12_3.png b/doc/user/clusters/img/cluster_environments_table_v12_3.png Binary files differnew file mode 100644 index 00000000000..52f232e2eb3 --- /dev/null +++ b/doc/user/clusters/img/cluster_environments_table_v12_3.png diff --git a/lib/api/api.rb b/lib/api/api.rb index 3bf16dc41d2..d71f0c38ce6 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -182,3 +182,5 @@ module API end end end + +API::API.prepend_if_ee('::EE::API::API') diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb index af9b519ed9e..a3fa7cd5cf9 100644 --- a/lib/api/api_guard.rb +++ b/lib/api/api_guard.rb @@ -41,6 +41,7 @@ module API # Helper Methods for Grape Endpoint module HelperMethods + prepend_if_ee('EE::API::APIGuard::HelperMethods') # rubocop: disable Cop/InjectEnterpriseEditionModule include Gitlab::Auth::UserAuthFinders def find_current_user! diff --git a/lib/api/boards.rb b/lib/api/boards.rb index 4e31f74f18a..87818903705 100644 --- a/lib/api/boards.rb +++ b/lib/api/boards.rb @@ -5,6 +5,8 @@ module API include BoardsResponses include PaginationParams + prepend_if_ee('EE::API::BoardsResponses') # rubocop: disable Cop/InjectEnterpriseEditionModule + before { authenticate! } helpers do diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 312c8d5b548..53774d4db1a 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -1780,7 +1780,6 @@ module API end # rubocop: disable Cop/InjectEnterpriseEditionModule -API::Entities.prepend_if_ee('EE::API::Entities::Entities') ::API::Entities::ApplicationSetting.prepend_if_ee('EE::API::Entities::ApplicationSetting') ::API::Entities::Board.prepend_if_ee('EE::API::Entities::Board') ::API::Entities::Group.prepend_if_ee('EE::API::Entities::Group', with_descendants: true) diff --git a/lib/api/group_boards.rb b/lib/api/group_boards.rb index feb2254963e..f7ef0cfd0d8 100644 --- a/lib/api/group_boards.rb +++ b/lib/api/group_boards.rb @@ -5,6 +5,8 @@ module API include BoardsResponses include PaginationParams + prepend_if_ee('EE::API::BoardsResponses') # rubocop: disable Cop/InjectEnterpriseEditionModule + before do authenticate! end diff --git a/lib/api/group_clusters.rb b/lib/api/group_clusters.rb index db0f8081140..a70ac63cc6e 100644 --- a/lib/api/group_clusters.rb +++ b/lib/api/group_clusters.rb @@ -16,6 +16,8 @@ module API end end + prepend_if_ee('EE::API::GroupClusters') # rubocop: disable Cop/InjectEnterpriseEditionModule + params do requires :id, type: String, desc: 'The ID of the group' end diff --git a/lib/api/group_milestones.rb b/lib/api/group_milestones.rb index d4287e4a7c4..eae29f5b5dd 100644 --- a/lib/api/group_milestones.rb +++ b/lib/api/group_milestones.rb @@ -95,3 +95,5 @@ module API end end end + +API::GroupMilestones.prepend_if_ee('EE::API::GroupMilestones') diff --git a/lib/api/groups.rb b/lib/api/groups.rb index 0b086f2e36d..4ae9b8c70d3 100644 --- a/lib/api/groups.rb +++ b/lib/api/groups.rb @@ -266,3 +266,5 @@ module API end end end + +API::Groups.prepend_if_ee('EE::API::Groups') diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index e61b25721fb..fad8bb13150 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -561,3 +561,5 @@ module API end end end + +API::Helpers.prepend_if_ee('EE::API::Helpers') diff --git a/lib/api/helpers/discussions_helpers.rb b/lib/api/helpers/discussions_helpers.rb index 94a5bf75c39..799d5582b38 100644 --- a/lib/api/helpers/discussions_helpers.rb +++ b/lib/api/helpers/discussions_helpers.rb @@ -11,3 +11,5 @@ module API end end end + +API::Helpers::DiscussionsHelpers.prepend_if_ee('EE::API::Helpers::DiscussionsHelpers') diff --git a/lib/api/helpers/groups_helpers.rb b/lib/api/helpers/groups_helpers.rb index 6af12828ca5..585ae1eb5c4 100644 --- a/lib/api/helpers/groups_helpers.rb +++ b/lib/api/helpers/groups_helpers.rb @@ -38,3 +38,5 @@ module API end end end + +API::Helpers::GroupsHelpers.prepend_if_ee('EE::API::Helpers::GroupsHelpers') diff --git a/lib/api/helpers/issues_helpers.rb b/lib/api/helpers/issues_helpers.rb index a8480bb9339..8addcd18fe3 100644 --- a/lib/api/helpers/issues_helpers.rb +++ b/lib/api/helpers/issues_helpers.rb @@ -65,3 +65,5 @@ module API end end end + +API::Helpers::IssuesHelpers.prepend_if_ee('EE::API::Helpers::IssuesHelpers') diff --git a/lib/api/helpers/notes_helpers.rb b/lib/api/helpers/notes_helpers.rb index f445834323d..8adfac346f6 100644 --- a/lib/api/helpers/notes_helpers.rb +++ b/lib/api/helpers/notes_helpers.rb @@ -134,3 +134,5 @@ module API end end end + +API::Helpers::NotesHelpers.prepend_if_ee('EE::API::Helpers::NotesHelpers') diff --git a/lib/api/helpers/project_snapshots_helpers.rb b/lib/api/helpers/project_snapshots_helpers.rb index 1b5dc281e38..13cec1bfd5c 100644 --- a/lib/api/helpers/project_snapshots_helpers.rb +++ b/lib/api/helpers/project_snapshots_helpers.rb @@ -3,6 +3,8 @@ module API module Helpers module ProjectSnapshotsHelpers + prepend_if_ee('::EE::API::Helpers::ProjectSnapshotsHelpers') # rubocop: disable Cop/InjectEnterpriseEditionModule + def authorize_read_git_snapshot! authenticated_with_full_private_access! end diff --git a/lib/api/helpers/projects_helpers.rb b/lib/api/helpers/projects_helpers.rb index c1e7af33235..f247c722c44 100644 --- a/lib/api/helpers/projects_helpers.rb +++ b/lib/api/helpers/projects_helpers.rb @@ -111,3 +111,5 @@ module API end end end + +API::Helpers::ProjectsHelpers.prepend_if_ee('EE::API::Helpers::ProjectsHelpers') diff --git a/lib/api/helpers/protected_branches_helpers.rb b/lib/api/helpers/protected_branches_helpers.rb index 0fc6841d79a..970a3687214 100644 --- a/lib/api/helpers/protected_branches_helpers.rb +++ b/lib/api/helpers/protected_branches_helpers.rb @@ -11,3 +11,5 @@ module API end end end + +API::Helpers::ProtectedBranchesHelpers.prepend_if_ee('EE::API::Helpers::ProtectedBranchesHelpers') diff --git a/lib/api/helpers/resource_label_events_helpers.rb b/lib/api/helpers/resource_label_events_helpers.rb index 23574deb59b..423bd4e704b 100644 --- a/lib/api/helpers/resource_label_events_helpers.rb +++ b/lib/api/helpers/resource_label_events_helpers.rb @@ -11,3 +11,5 @@ module API end end end + +API::Helpers::ResourceLabelEventsHelpers.prepend_if_ee('EE::API::Helpers::ResourceLabelEventsHelpers') diff --git a/lib/api/helpers/runner.rb b/lib/api/helpers/runner.rb index 41ee34a8fdf..11631378137 100644 --- a/lib/api/helpers/runner.rb +++ b/lib/api/helpers/runner.rb @@ -3,6 +3,8 @@ module API module Helpers module Runner + prepend_if_ee('EE::API::Helpers::Runner') # rubocop: disable Cop/InjectEnterpriseEditionModule + JOB_TOKEN_HEADER = 'HTTP_JOB_TOKEN' JOB_TOKEN_PARAM = :token diff --git a/lib/api/helpers/search_helpers.rb b/lib/api/helpers/search_helpers.rb index 0e052e0e273..de8cbe62106 100644 --- a/lib/api/helpers/search_helpers.rb +++ b/lib/api/helpers/search_helpers.rb @@ -20,3 +20,5 @@ module API end end end + +API::Helpers::SearchHelpers.prepend_if_ee('EE::API::Helpers::SearchHelpers') diff --git a/lib/api/helpers/services_helpers.rb b/lib/api/helpers/services_helpers.rb index 422db5c7a50..607a498ffb2 100644 --- a/lib/api/helpers/services_helpers.rb +++ b/lib/api/helpers/services_helpers.rb @@ -739,3 +739,5 @@ module API end end end + +API::Helpers::ServicesHelpers.prepend_if_ee('EE::API::Helpers::ServicesHelpers') diff --git a/lib/api/helpers/settings_helpers.rb b/lib/api/helpers/settings_helpers.rb index 6441bb579ff..65aec6ae2e7 100644 --- a/lib/api/helpers/settings_helpers.rb +++ b/lib/api/helpers/settings_helpers.rb @@ -17,3 +17,5 @@ module API end end end + +API::Helpers::SettingsHelpers.prepend_if_ee('EE::API::Helpers::SettingsHelpers') diff --git a/lib/api/helpers/users_helpers.rb b/lib/api/helpers/users_helpers.rb index 56fd3c6602d..99eefc1cbb9 100644 --- a/lib/api/helpers/users_helpers.rb +++ b/lib/api/helpers/users_helpers.rb @@ -14,3 +14,5 @@ module API end end end + +API::Helpers::UsersHelpers.prepend_if_ee('EE::API::Helpers::UsersHelpers') diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb index 087985d34b0..cde7b0e1eea 100644 --- a/lib/api/internal/base.rb +++ b/lib/api/internal/base.rb @@ -271,3 +271,5 @@ module API end end end + +API::Internal::Base.prepend_if_ee('EE::API::Internal::Base') diff --git a/lib/api/job_artifacts.rb b/lib/api/job_artifacts.rb index b35aa952f81..920938ad453 100644 --- a/lib/api/job_artifacts.rb +++ b/lib/api/job_artifacts.rb @@ -11,6 +11,8 @@ module API end end + prepend_if_ee('EE::API::JobArtifacts') # rubocop: disable Cop/InjectEnterpriseEditionModule + params do requires :id, type: String, desc: 'The ID of a project' end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 4c092f10729..f317ae717bd 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -33,6 +33,8 @@ module API ] end + prepend_if_ee('EE::API::MergeRequests') # rubocop: disable Cop/InjectEnterpriseEditionModule + helpers do # rubocop: disable CodeReuse/ActiveRecord def find_merge_requests(args = {}) diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb index 77ecb3e7cde..c51417d2889 100644 --- a/lib/api/namespaces.rb +++ b/lib/api/namespaces.rb @@ -17,6 +17,8 @@ module API end end + prepend_if_ee('EE::API::Namespaces') # rubocop: disable Cop/InjectEnterpriseEditionModule + resource :namespaces do desc 'Get a namespaces list' do success Entities::Namespace diff --git a/lib/api/project_clusters.rb b/lib/api/project_clusters.rb index 4f093e9be08..45c800d7d1e 100644 --- a/lib/api/project_clusters.rb +++ b/lib/api/project_clusters.rb @@ -16,6 +16,8 @@ module API end end + prepend_if_ee('EE::API::ProjectClusters') # rubocop: disable Cop/InjectEnterpriseEditionModule + params do requires :id, type: String, desc: 'The ID of the project' end diff --git a/lib/api/project_milestones.rb b/lib/api/project_milestones.rb index 9ecbf37b49a..aebf7d5fae1 100644 --- a/lib/api/project_milestones.rb +++ b/lib/api/project_milestones.rb @@ -116,3 +116,5 @@ module API end end end + +API::ProjectMilestones.prepend_if_ee('EE::API::ProjectMilestones') diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 63bfa8db61c..74de9fcec68 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -533,3 +533,5 @@ module API end end end + +API::Projects.prepend_if_ee('EE::API::Projects') diff --git a/lib/api/protected_branches.rb b/lib/api/protected_branches.rb index 33dea25289a..ca75ee906ce 100644 --- a/lib/api/protected_branches.rb +++ b/lib/api/protected_branches.rb @@ -59,6 +59,7 @@ module API # rubocop: disable CodeReuse/ActiveRecord post ':id/protected_branches' do protected_branch = user_project.protected_branches.find_by(name: params[:name]) + if protected_branch conflict!("Protected branch '#{params[:name]}' already exists") end diff --git a/lib/api/search.rb b/lib/api/search.rb index 1cab1a97186..50f930c7c7c 100644 --- a/lib/api/search.rb +++ b/lib/api/search.rb @@ -123,3 +123,5 @@ module API end end end + +API::Search.prepend_if_ee('EE::API::Search') diff --git a/lib/api/services.rb b/lib/api/services.rb index bc77fae87fa..aa5354e20c3 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -162,3 +162,5 @@ module API end end end + +API::Services.prepend_if_ee('EE::API::Services') diff --git a/lib/api/settings.rb b/lib/api/settings.rb index acf03051a5b..e4ef507228b 100644 --- a/lib/api/settings.rb +++ b/lib/api/settings.rb @@ -187,3 +187,5 @@ module API end end end + +API::Settings.prepend_if_ee('EE::API::Settings') diff --git a/lib/api/validations/check_assignees_count.rb b/lib/api/validations/check_assignees_count.rb index 836ec936b31..451b14c623c 100644 --- a/lib/api/validations/check_assignees_count.rb +++ b/lib/api/validations/check_assignees_count.rb @@ -30,3 +30,5 @@ module API end end end + +API::Validations::CheckAssigneesCount.prepend_if_ee('EE::API::Validations::CheckAssigneesCount') diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index a0439089879..ca1f61055b0 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -408,3 +408,5 @@ module Banzai end end end + +Banzai::Filter::AbstractReferenceFilter.prepend_if_ee('EE::Banzai::Filter::AbstractReferenceFilter') diff --git a/lib/banzai/filter/epic_reference_filter.rb b/lib/banzai/filter/epic_reference_filter.rb index 26bcf5c04b4..d1e1a56424d 100644 --- a/lib/banzai/filter/epic_reference_filter.rb +++ b/lib/banzai/filter/epic_reference_filter.rb @@ -4,6 +4,8 @@ module Banzai module Filter # The actual filter is implemented in the EE mixin class EpicReferenceFilter < IssuableReferenceFilter + prepend_if_ee('EE::Banzai::Filter::EpicReferenceFilter') # rubocop: disable Cop/InjectEnterpriseEditionModule + self.reference_type = :epic def self.object_class diff --git a/lib/banzai/filter/label_reference_filter.rb b/lib/banzai/filter/label_reference_filter.rb index a0789b7ca06..db620c65237 100644 --- a/lib/banzai/filter/label_reference_filter.rb +++ b/lib/banzai/filter/label_reference_filter.rb @@ -111,3 +111,5 @@ module Banzai end end end + +Banzai::Filter::LabelReferenceFilter.prepend_if_ee('EE::Banzai::Filter::LabelReferenceFilter') diff --git a/lib/banzai/issuable_extractor.rb b/lib/banzai/issuable_extractor.rb index 31bb4f2e01c..d1e8587314c 100644 --- a/lib/banzai/issuable_extractor.rb +++ b/lib/banzai/issuable_extractor.rb @@ -9,6 +9,8 @@ module Banzai # so we can avoid N+1 queries problem class IssuableExtractor + prepend_if_ee('EE::Banzai::IssuableExtractor') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :context ISSUE_REFERENCE_TYPE = '@data-reference-type="issue"' diff --git a/lib/banzai/pipeline/gfm_pipeline.rb b/lib/banzai/pipeline/gfm_pipeline.rb index f419e54c264..bb0d1eaa1e1 100644 --- a/lib/banzai/pipeline/gfm_pipeline.rb +++ b/lib/banzai/pipeline/gfm_pipeline.rb @@ -3,6 +3,8 @@ module Banzai module Pipeline class GfmPipeline < BasePipeline + prepend_if_ee('EE::Banzai::Pipeline::GfmPipeline') # rubocop: disable Cop/InjectEnterpriseEditionModule + # These filters transform GitLab Flavored Markdown (GFM) to HTML. # The nodes and marks referenced in app/assets/javascripts/behaviors/markdown/editor_extensions.js # consequently transform that same HTML to GFM to be copied to the clipboard. diff --git a/lib/banzai/pipeline/post_process_pipeline.rb b/lib/banzai/pipeline/post_process_pipeline.rb index 54af26b41be..fe629a23ff1 100644 --- a/lib/banzai/pipeline/post_process_pipeline.rb +++ b/lib/banzai/pipeline/post_process_pipeline.rb @@ -3,6 +3,8 @@ module Banzai module Pipeline class PostProcessPipeline < BasePipeline + prepend_if_ee('EE::Banzai::Pipeline::PostProcessPipeline') # rubocop: disable Cop/InjectEnterpriseEditionModule + def self.filters @filters ||= FilterArray[ *internal_link_filters, diff --git a/lib/banzai/pipeline/single_line_pipeline.rb b/lib/banzai/pipeline/single_line_pipeline.rb index 9aff6880f56..a16ab04b792 100644 --- a/lib/banzai/pipeline/single_line_pipeline.rb +++ b/lib/banzai/pipeline/single_line_pipeline.rb @@ -3,6 +3,8 @@ module Banzai module Pipeline class SingleLinePipeline < GfmPipeline + prepend_if_ee('EE::Banzai::Pipeline::SingleLinePipeline') # rubocop: disable Cop/InjectEnterpriseEditionModule + def self.filters @filters ||= FilterArray[ Filter::HtmlEntityFilter, diff --git a/lib/banzai/reference_parser/epic_parser.rb b/lib/banzai/reference_parser/epic_parser.rb index 7f366f0f8ab..b5fbf7accc4 100644 --- a/lib/banzai/reference_parser/epic_parser.rb +++ b/lib/banzai/reference_parser/epic_parser.rb @@ -4,6 +4,8 @@ module Banzai module ReferenceParser # The actual parser is implemented in the EE mixin class EpicParser < IssuableParser + prepend_if_ee('::EE::Banzai::ReferenceParser::EpicParser') # rubocop: disable Cop/InjectEnterpriseEditionModule + self.reference_type = :epic def records_for_nodes(_nodes) diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb index 82810ea4076..15f40993ea3 100644 --- a/lib/container_registry/client.rb +++ b/lib/container_registry/client.rb @@ -110,3 +110,5 @@ module ContainerRegistry end end end + +ContainerRegistry::Client.prepend_if_ee('EE::ContainerRegistry::Client') diff --git a/lib/feature.rb b/lib/feature.rb index c70a6980f19..88b0d871c3a 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -4,6 +4,8 @@ require 'flipper/adapters/active_record' require 'flipper/adapters/active_support_cache_store' class Feature + prepend_if_ee('EE::Feature') # rubocop: disable Cop/InjectEnterpriseEditionModule + # Classes to override flipper table names class FlipperFeature < Flipper::Adapters::ActiveRecord::Feature # Using `self.table_name` won't work. ActiveRecord bug? diff --git a/lib/gitlab.rb b/lib/gitlab.rb index 582541c0679..b337f5cbf2c 100644 --- a/lib/gitlab.rb +++ b/lib/gitlab.rb @@ -56,7 +56,11 @@ module Gitlab end def self.dev_env_org_or_com? - Rails.env.development? || org? || com? + dev_env_or_com? || org? + end + + def self.dev_env_or_com? + Rails.env.development? || com? end def self.ee? diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb index 7ef9f7ef630..ed5816482a9 100644 --- a/lib/gitlab/access.rb +++ b/lib/gitlab/access.rb @@ -132,3 +132,5 @@ module Gitlab end end end + +Gitlab::Access.prepend_if_ee('EE::Gitlab::Access') diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb index bdc46abeb9f..53c1398d6ab 100644 --- a/lib/gitlab/auth.rb +++ b/lib/gitlab/auth.rb @@ -26,6 +26,8 @@ module Gitlab DEFAULT_SCOPES = [:api].freeze class << self + prepend_if_ee('EE::Gitlab::Auth') # rubocop: disable Cop/InjectEnterpriseEditionModule + def omniauth_enabled? Gitlab.config.omniauth.enabled end diff --git a/lib/gitlab/auth/ldap/access.rb b/lib/gitlab/auth/ldap/access.rb index c875bba4bcb..b8ed740e08c 100644 --- a/lib/gitlab/auth/ldap/access.rb +++ b/lib/gitlab/auth/ldap/access.rb @@ -8,6 +8,8 @@ module Gitlab module Auth module LDAP class Access + prepend_if_ee('::EE::Gitlab::Auth::LDAP::Access') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :provider, :user, :ldap_identity def self.open(user, &block) diff --git a/lib/gitlab/auth/ldap/adapter.rb b/lib/gitlab/auth/ldap/adapter.rb index bcb0ecccdf9..356579ef402 100644 --- a/lib/gitlab/auth/ldap/adapter.rb +++ b/lib/gitlab/auth/ldap/adapter.rb @@ -4,6 +4,8 @@ module Gitlab module Auth module LDAP class Adapter + prepend_if_ee('::EE::Gitlab::Auth::LDAP::Adapter') # rubocop: disable Cop/InjectEnterpriseEditionModule + SEARCH_RETRY_FACTOR = [1, 1, 2, 3].freeze MAX_SEARCH_RETRIES = Rails.env.test? ? 1 : SEARCH_RETRY_FACTOR.size.freeze diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb index 354f91306f9..eb1d0925c55 100644 --- a/lib/gitlab/auth/ldap/config.rb +++ b/lib/gitlab/auth/ldap/config.rb @@ -5,6 +5,8 @@ module Gitlab module Auth module LDAP class Config + prepend_if_ee('::EE::Gitlab::Auth::LDAP::Config') # rubocop: disable Cop/InjectEnterpriseEditionModule + NET_LDAP_ENCRYPTION_METHOD = { simple_tls: :simple_tls, start_tls: :start_tls, diff --git a/lib/gitlab/auth/ldap/person.rb b/lib/gitlab/auth/ldap/person.rb index 11a4052a109..88ec22aa75c 100644 --- a/lib/gitlab/auth/ldap/person.rb +++ b/lib/gitlab/auth/ldap/person.rb @@ -4,6 +4,8 @@ module Gitlab module Auth module LDAP class Person + prepend_if_ee('::EE::Gitlab::Auth::LDAP::Person') # rubocop: disable Cop/InjectEnterpriseEditionModule + # Active Directory-specific LDAP filter that checks if bit 2 of the # userAccountControl attribute is set. # Source: http://ctogonewild.com/2009/09/03/bitmask-searches-in-ldap/ diff --git a/lib/gitlab/auth/ldap/user.rb b/lib/gitlab/auth/ldap/user.rb index 9c71671f409..3b68230e193 100644 --- a/lib/gitlab/auth/ldap/user.rb +++ b/lib/gitlab/auth/ldap/user.rb @@ -11,6 +11,7 @@ module Gitlab module LDAP class User < Gitlab::Auth::OAuth::User extend ::Gitlab::Utils::Override + prepend_if_ee('::EE::Gitlab::Auth::LDAP::User') # rubocop: disable Cop/InjectEnterpriseEditionModule class << self # rubocop: disable CodeReuse/ActiveRecord diff --git a/lib/gitlab/auth/o_auth/auth_hash.rb b/lib/gitlab/auth/o_auth/auth_hash.rb index 91b9ddc0d00..76f2827af1a 100644 --- a/lib/gitlab/auth/o_auth/auth_hash.rb +++ b/lib/gitlab/auth/o_auth/auth_hash.rb @@ -6,6 +6,8 @@ module Gitlab module Auth module OAuth class AuthHash + prepend_if_ee('::EE::Gitlab::Auth::OAuth::AuthHash') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :auth_hash def initialize(auth_hash) @auth_hash = auth_hash diff --git a/lib/gitlab/auth/o_auth/user.rb b/lib/gitlab/auth/o_auth/user.rb index f121dce4cbb..300181025a4 100644 --- a/lib/gitlab/auth/o_auth/user.rb +++ b/lib/gitlab/auth/o_auth/user.rb @@ -9,6 +9,8 @@ module Gitlab module Auth module OAuth class User + prepend_if_ee('::EE::Gitlab::Auth::OAuth::User') # rubocop: disable Cop/InjectEnterpriseEditionModule + SignupDisabledError = Class.new(StandardError) SigninDisabledForProviderError = Class.new(StandardError) diff --git a/lib/gitlab/auth/result.rb b/lib/gitlab/auth/result.rb index 4ebf2afb9cb..0fe91f9f3c8 100644 --- a/lib/gitlab/auth/result.rb +++ b/lib/gitlab/auth/result.rb @@ -3,6 +3,8 @@ module Gitlab module Auth Result = Struct.new(:actor, :project, :type, :authentication_abilities) do + prepend_if_ee('::EE::Gitlab::Auth::Result') # rubocop: disable Cop/InjectEnterpriseEditionModule + def ci?(for_project) type == :ci && project && diff --git a/lib/gitlab/auth/saml/config.rb b/lib/gitlab/auth/saml/config.rb index 8cb999f50d4..ed2f3f158c1 100644 --- a/lib/gitlab/auth/saml/config.rb +++ b/lib/gitlab/auth/saml/config.rb @@ -4,6 +4,8 @@ module Gitlab module Auth module Saml class Config + prepend_if_ee('::EE::Gitlab::Auth::Saml::Config') # rubocop: disable Cop/InjectEnterpriseEditionModule + class << self def options Gitlab::Auth::OAuth::Provider.config_for('saml') diff --git a/lib/gitlab/auth/saml/user.rb b/lib/gitlab/auth/saml/user.rb index ec95bc46791..1ba36ad95b4 100644 --- a/lib/gitlab/auth/saml/user.rb +++ b/lib/gitlab/auth/saml/user.rb @@ -9,6 +9,8 @@ module Gitlab module Auth module Saml class User < Gitlab::Auth::OAuth::User + prepend_if_ee('::EE::Gitlab::Auth::Saml::User') # rubocop: disable Cop/InjectEnterpriseEditionModule + extend ::Gitlab::Utils::Override def save diff --git a/lib/gitlab/auth/user_auth_finders.rb b/lib/gitlab/auth/user_auth_finders.rb index 76d41eede23..e2f562c0843 100644 --- a/lib/gitlab/auth/user_auth_finders.rb +++ b/lib/gitlab/auth/user_auth_finders.rb @@ -18,6 +18,8 @@ module Gitlab end module UserAuthFinders + prepend_if_ee('::EE::Gitlab::Auth::UserAuthFinders') # rubocop: disable Cop/InjectEnterpriseEditionModule + include Gitlab::Utils::StrongMemoize PRIVATE_TOKEN_HEADER = 'HTTP_PRIVATE_TOKEN' diff --git a/lib/gitlab/checks/base_checker.rb b/lib/gitlab/checks/base_checker.rb index 09b17b5b76b..a14fa02c2a4 100644 --- a/lib/gitlab/checks/base_checker.rb +++ b/lib/gitlab/checks/base_checker.rb @@ -3,6 +3,7 @@ module Gitlab module Checks class BaseChecker + prepend_if_ee('EE::Gitlab::Checks::BaseChecker') # rubocop: disable Cop/InjectEnterpriseEditionModule include Gitlab::Utils::StrongMemoize attr_reader :change_access diff --git a/lib/gitlab/checks/change_access.rb b/lib/gitlab/checks/change_access.rb index 8a57a3a6d9a..14a445fcb96 100644 --- a/lib/gitlab/checks/change_access.rb +++ b/lib/gitlab/checks/change_access.rb @@ -3,6 +3,8 @@ module Gitlab module Checks class ChangeAccess + prepend_if_ee('EE::Gitlab::Checks::ChangeAccess') # rubocop: disable Cop/InjectEnterpriseEditionModule + ATTRIBUTES = %i[user_access project skip_authorization skip_lfs_integrity_check protocol oldrev newrev ref branch_name tag_name logger commits].freeze diff --git a/lib/gitlab/checks/diff_check.rb b/lib/gitlab/checks/diff_check.rb index ea0d8c85a66..6372d96c07d 100644 --- a/lib/gitlab/checks/diff_check.rb +++ b/lib/gitlab/checks/diff_check.rb @@ -4,6 +4,7 @@ module Gitlab module Checks class DiffCheck < BaseChecker include Gitlab::Utils::StrongMemoize + prepend_if_ee('EE::Gitlab::Checks::DiffCheck') # rubocop: disable Cop/InjectEnterpriseEditionModule LOG_MESSAGES = { validate_file_paths: "Validating diffs' file paths...", diff --git a/lib/gitlab/ci/config.rb b/lib/gitlab/ci/config.rb index cde042c5e0a..668e4a5e246 100644 --- a/lib/gitlab/ci/config.rb +++ b/lib/gitlab/ci/config.rb @@ -82,3 +82,5 @@ module Gitlab end end end + +Gitlab::Ci::Config.prepend_if_ee('EE::Gitlab::Ci::ConfigEE') diff --git a/lib/gitlab/ci/config/entry/jobs.rb b/lib/gitlab/ci/config/entry/jobs.rb index 9d1a1ee8c4b..b517dae4d2e 100644 --- a/lib/gitlab/ci/config/entry/jobs.rb +++ b/lib/gitlab/ci/config/entry/jobs.rb @@ -77,3 +77,5 @@ module Gitlab end end end + +::Gitlab::Ci::Config::Entry::Jobs.prepend_if_ee('::EE::Gitlab::Ci::Config::Entry::Jobs') diff --git a/lib/gitlab/ci/parsers.rb b/lib/gitlab/ci/parsers.rb index eb63e6c8363..c76cd5ff285 100644 --- a/lib/gitlab/ci/parsers.rb +++ b/lib/gitlab/ci/parsers.rb @@ -3,6 +3,8 @@ module Gitlab module Ci module Parsers + prepend_if_ee('::EE::Gitlab::Ci::Parsers') # rubocop: disable Cop/InjectEnterpriseEditionModule + ParserNotFoundError = Class.new(ParserError) def self.parsers diff --git a/lib/gitlab/ci/pipeline/chain/limit/activity.rb b/lib/gitlab/ci/pipeline/chain/limit/activity.rb index 68482cf08a9..3c64278e305 100644 --- a/lib/gitlab/ci/pipeline/chain/limit/activity.rb +++ b/lib/gitlab/ci/pipeline/chain/limit/activity.rb @@ -19,3 +19,5 @@ module Gitlab end end end + +Gitlab::Ci::Pipeline::Chain::Limit::Activity.prepend_if_ee('EE::Gitlab::Ci::Pipeline::Chain::Limit::Activity') diff --git a/lib/gitlab/ci/pipeline/chain/limit/job_activity.rb b/lib/gitlab/ci/pipeline/chain/limit/job_activity.rb index 31c218bf954..2e8b437252f 100644 --- a/lib/gitlab/ci/pipeline/chain/limit/job_activity.rb +++ b/lib/gitlab/ci/pipeline/chain/limit/job_activity.rb @@ -19,3 +19,5 @@ module Gitlab end end end + +Gitlab::Ci::Pipeline::Chain::Limit::JobActivity.prepend_if_ee('EE::Gitlab::Ci::Pipeline::Chain::Limit::JobActivity') diff --git a/lib/gitlab/ci/pipeline/chain/limit/size.rb b/lib/gitlab/ci/pipeline/chain/limit/size.rb index cd330c58406..739648840e9 100644 --- a/lib/gitlab/ci/pipeline/chain/limit/size.rb +++ b/lib/gitlab/ci/pipeline/chain/limit/size.rb @@ -19,3 +19,5 @@ module Gitlab end end end + +Gitlab::Ci::Pipeline::Chain::Limit::Size.prepend_if_ee('EE::Gitlab::Ci::Pipeline::Chain::Limit::Size') diff --git a/lib/gitlab/ci/pipeline/chain/validate/abilities.rb b/lib/gitlab/ci/pipeline/chain/validate/abilities.rb index 357a1d55b3b..f9ed9d91177 100644 --- a/lib/gitlab/ci/pipeline/chain/validate/abilities.rb +++ b/lib/gitlab/ci/pipeline/chain/validate/abilities.rb @@ -60,3 +60,5 @@ module Gitlab end end end + +Gitlab::Ci::Pipeline::Chain::Validate::Abilities.prepend_if_ee('EE::Gitlab::Ci::Pipeline::Chain::Validate::Abilities') diff --git a/lib/gitlab/ci/status/build/failed.rb b/lib/gitlab/ci/status/build/failed.rb index 76dfe7b7639..961012c2cee 100644 --- a/lib/gitlab/ci/status/build/failed.rb +++ b/lib/gitlab/ci/status/build/failed.rb @@ -21,6 +21,8 @@ module Gitlab private_constant :REASONS + prepend_if_ee('::EE::Gitlab::Ci::Status::Build::Failed') # rubocop: disable Cop/InjectEnterpriseEditionModule + def status_tooltip base_message end diff --git a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml index 2afc99d0bf8..56ce33203ad 100644 --- a/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Security/Container-Scanning.gitlab-ci.yml @@ -1,4 +1,4 @@ -# Read more about this feature here: https://docs.gitlab.com/ee/user/project/merge_requests/container_scanning.html +# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/container_scanning/ container_scanning: stage: test diff --git a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml index 15b84f1540d..c8930bc6263 100644 --- a/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Security/Dependency-Scanning.gitlab-ci.yml @@ -1,4 +1,4 @@ -# Read more about this feature here: https://docs.gitlab.com/ee/user/project/merge_requests/dependency_scanning.html +# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/ # # Configure the scanning tool through the environment variables. # List of the variables: https://gitlab.com/gitlab-org/security-products/dependency-scanning#settings diff --git a/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml index b6555e627a1..f10a445f7c9 100644 --- a/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Security/License-Management.gitlab-ci.yml @@ -1,4 +1,8 @@ -# Read more about this feature here: https://docs.gitlab.com/ee/user/project/merge_requests/license_management.html +# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/license_management/ +# +# Configure the scanning tool through the environment variables. +# List of the variables: https://gitlab.com/gitlab-org/security-products/license-management#settings +# How to set: https://docs.gitlab.com/ee/ci/yaml/#variables variables: LICENSE_MANAGEMENT_SETUP_CMD: '' # If needed, specify a command to setup your environment with a custom package manager. diff --git a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml index 90278122361..a61731a24b7 100644 --- a/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Security/SAST.gitlab-ci.yml @@ -1,4 +1,4 @@ -# Read more about this feature here: https://docs.gitlab.com/ee/user/project/merge_requests/sast.html +# Read more about this feature here: https://docs.gitlab.com/ee/user/application_security/sast/ # # Configure the scanning tool through the environment variables. # List of the variables: https://gitlab.com/gitlab-org/security-products/sast#settings diff --git a/lib/gitlab/cleanup/orphan_job_artifact_files.rb b/lib/gitlab/cleanup/orphan_job_artifact_files.rb index 808814c39e0..1b01ca25559 100644 --- a/lib/gitlab/cleanup/orphan_job_artifact_files.rb +++ b/lib/gitlab/cleanup/orphan_job_artifact_files.rb @@ -130,3 +130,5 @@ module Gitlab end end end + +Gitlab::Cleanup::OrphanJobArtifactFiles.prepend_if_ee('EE::Gitlab::Cleanup::OrphanJobArtifactFiles') diff --git a/lib/gitlab/cleanup/orphan_job_artifact_files_batch.rb b/lib/gitlab/cleanup/orphan_job_artifact_files_batch.rb index 53e0c83046e..6ad05c7b2e4 100644 --- a/lib/gitlab/cleanup/orphan_job_artifact_files_batch.rb +++ b/lib/gitlab/cleanup/orphan_job_artifact_files_batch.rb @@ -78,3 +78,5 @@ module Gitlab end end end + +Gitlab::Cleanup::OrphanJobArtifactFilesBatch.prepend_if_ee('EE::Gitlab::Cleanup::OrphanJobArtifactFilesBatch') diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 6ecd506d55b..e4e93b59a36 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -309,3 +309,5 @@ module Gitlab end end end + +Gitlab::Database.prepend_if_ee('EE::Gitlab::Database') diff --git a/lib/gitlab/database_importers/common_metrics.rb b/lib/gitlab/database_importers/common_metrics.rb index f964ae8a275..b9d320f2fc7 100644 --- a/lib/gitlab/database_importers/common_metrics.rb +++ b/lib/gitlab/database_importers/common_metrics.rb @@ -6,3 +6,5 @@ module Gitlab end end end + +Gitlab::DatabaseImporters::CommonMetrics.prepend_if_ee('EE::Gitlab::DatabaseImporters::CommonMetrics') diff --git a/lib/gitlab/database_importers/common_metrics/prometheus_metric_enums.rb b/lib/gitlab/database_importers/common_metrics/prometheus_metric_enums.rb index c9e957ec7c0..409a1252da1 100644 --- a/lib/gitlab/database_importers/common_metrics/prometheus_metric_enums.rb +++ b/lib/gitlab/database_importers/common_metrics/prometheus_metric_enums.rb @@ -38,3 +38,5 @@ module Gitlab end end end + +::Gitlab::DatabaseImporters::CommonMetrics::PrometheusMetricEnums.prepend_if_ee('EE::Gitlab::DatabaseImporters::CommonMetrics::PrometheusMetricEnums') diff --git a/lib/gitlab/email/handler.rb b/lib/gitlab/email/handler.rb index cebedb19dcc..e9a7c9bcf5c 100644 --- a/lib/gitlab/email/handler.rb +++ b/lib/gitlab/email/handler.rb @@ -3,6 +3,8 @@ module Gitlab module Email module Handler + prepend_if_ee('::EE::Gitlab::Email::Handler') # rubocop: disable Cop/InjectEnterpriseEditionModule + def self.handlers @handlers ||= load_handlers end diff --git a/lib/gitlab/email/handler/base_handler.rb b/lib/gitlab/email/handler/base_handler.rb index f89d1d15010..2e487c42cb5 100644 --- a/lib/gitlab/email/handler/base_handler.rb +++ b/lib/gitlab/email/handler/base_handler.rb @@ -24,6 +24,14 @@ module Gitlab def metrics_params { handler: self.class.name } end + + # Each handler should use it's own metric event. Otherwise there + # is a possibility that within the same Sidekiq process, that same + # event with different metrics_params will cause Prometheus to + # throw an error + def metrics_event + raise NotImplementedError + end end end end diff --git a/lib/gitlab/email/handler/create_issue_handler.rb b/lib/gitlab/email/handler/create_issue_handler.rb index 78a3a9489ac..22fc8addcd9 100644 --- a/lib/gitlab/email/handler/create_issue_handler.rb +++ b/lib/gitlab/email/handler/create_issue_handler.rb @@ -48,6 +48,10 @@ module Gitlab end # rubocop: enable CodeReuse/ActiveRecord + def metrics_event + :receive_email_create_issue + end + private def create_issue diff --git a/lib/gitlab/email/handler/create_merge_request_handler.rb b/lib/gitlab/email/handler/create_merge_request_handler.rb index b3b5063f2ca..e8071bcafd0 100644 --- a/lib/gitlab/email/handler/create_merge_request_handler.rb +++ b/lib/gitlab/email/handler/create_merge_request_handler.rb @@ -54,6 +54,10 @@ module Gitlab super.merge(includes_patches: patch_attachments.any?) end + def metrics_event + :receive_email_create_merge_request + end + private def build_merge_request diff --git a/lib/gitlab/email/handler/create_note_handler.rb b/lib/gitlab/email/handler/create_note_handler.rb index b00af15364d..28200643296 100644 --- a/lib/gitlab/email/handler/create_note_handler.rb +++ b/lib/gitlab/email/handler/create_note_handler.rb @@ -32,6 +32,10 @@ module Gitlab record_name: 'comment') end + def metrics_event + :receive_email_create_note + end + private def author diff --git a/lib/gitlab/email/handler/unsubscribe_handler.rb b/lib/gitlab/email/handler/unsubscribe_handler.rb index 20e4c125626..528857aff14 100644 --- a/lib/gitlab/email/handler/unsubscribe_handler.rb +++ b/lib/gitlab/email/handler/unsubscribe_handler.rb @@ -36,6 +36,10 @@ module Gitlab noteable.unsubscribe(sent_notification.recipient) end + def metrics_event + :receive_email_unsubscribe + end + private attr_reader :reply_token diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index d28f6b301fa..7da8b385266 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -39,9 +39,9 @@ module Gitlab raise UnknownIncomingEmail unless handler - Gitlab::Metrics.add_event(:receive_email, handler.metrics_params) - - handler.execute + handler.execute.tap do + Gitlab::Metrics.add_event(handler.metrics_event, handler.metrics_params) + end end private diff --git a/lib/gitlab/etag_caching/router.rb b/lib/gitlab/etag_caching/router.rb index d09dcdbb337..7b921ab6199 100644 --- a/lib/gitlab/etag_caching/router.rb +++ b/lib/gitlab/etag_caching/router.rb @@ -3,6 +3,8 @@ module Gitlab module EtagCaching class Router + prepend_if_ee('EE::Gitlab::EtagCaching::Router') # rubocop: disable Cop/InjectEnterpriseEditionModule + Route = Struct.new(:regexp, :name) # We enable an ETag for every request matching the regex. # To match a regex the path needs to match the following: diff --git a/lib/gitlab/exclusive_lease.rb b/lib/gitlab/exclusive_lease.rb index d466d2a514c..425ef5d738a 100644 --- a/lib/gitlab/exclusive_lease.rb +++ b/lib/gitlab/exclusive_lease.rb @@ -96,3 +96,5 @@ module Gitlab end end end + +Gitlab::ExclusiveLease.prepend_if_ee('EE::Gitlab::ExclusiveLease') diff --git a/lib/gitlab/fake_application_settings.rb b/lib/gitlab/fake_application_settings.rb index 77f7d9490f3..74b91277dd7 100644 --- a/lib/gitlab/fake_application_settings.rb +++ b/lib/gitlab/fake_application_settings.rb @@ -32,3 +32,5 @@ module Gitlab alias_method :has_attribute?, :[] end end + +Gitlab::FakeApplicationSettings.prepend_if_ee('EE::Gitlab::FakeApplicationSettings') diff --git a/lib/gitlab/favicon.rb b/lib/gitlab/favicon.rb index 519213e143c..b5d308e462c 100644 --- a/lib/gitlab/favicon.rb +++ b/lib/gitlab/favicon.rb @@ -60,3 +60,5 @@ module Gitlab end end end + +Gitlab::Favicon.prepend_if_ee('EE::Gitlab::Favicon') diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 4b626509008..7e9ec097ef7 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -408,3 +408,5 @@ module Gitlab end end end + +Gitlab::GitAccess.prepend_if_ee('EE::Gitlab::GitAccess') diff --git a/lib/gitlab/git_access_wiki.rb b/lib/gitlab/git_access_wiki.rb index 0af91957fa8..3d0db753f6e 100644 --- a/lib/gitlab/git_access_wiki.rb +++ b/lib/gitlab/git_access_wiki.rb @@ -2,6 +2,8 @@ module Gitlab class GitAccessWiki < GitAccess + prepend_if_ee('EE::Gitlab::GitAccessWiki') # rubocop: disable Cop/InjectEnterpriseEditionModule + ERROR_MESSAGES = { read_only: "You can't push code to a read-only GitLab instance.", write_to_wiki: "You are not allowed to write to this project's wiki." diff --git a/lib/gitlab/github_import/parallel_importer.rb b/lib/gitlab/github_import/parallel_importer.rb index 1d3541b80c7..cdd2abaeb4c 100644 --- a/lib/gitlab/github_import/parallel_importer.rb +++ b/lib/gitlab/github_import/parallel_importer.rb @@ -5,6 +5,8 @@ module Gitlab # The ParallelImporter schedules the importing of a GitHub project using # Sidekiq. class ParallelImporter + prepend_if_ee('::EE::Gitlab::GithubImport::ParallelImporter') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :project def self.async? diff --git a/lib/gitlab/gl_repository.rb b/lib/gitlab/gl_repository.rb index 04dabe423e8..99bf4258c07 100644 --- a/lib/gitlab/gl_repository.rb +++ b/lib/gitlab/gl_repository.rb @@ -49,3 +49,5 @@ module Gitlab private_class_method :instance end end + +Gitlab::GlRepository.prepend_if_ee('::EE::Gitlab::GlRepository') diff --git a/lib/gitlab/hook_data/issue_builder.rb b/lib/gitlab/hook_data/issue_builder.rb index e5f86ca02b5..1f64e440141 100644 --- a/lib/gitlab/hook_data/issue_builder.rb +++ b/lib/gitlab/hook_data/issue_builder.rb @@ -24,6 +24,7 @@ module Gitlab last_edited_by_id milestone_id moved_to_id + duplicated_to_id project_id relative_position state @@ -54,3 +55,5 @@ module Gitlab end end end + +Gitlab::HookData::IssueBuilder.prepend_if_ee('EE::Gitlab::HookData::IssueBuilder') diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 0be49e27acb..1e9dff405c5 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -3,6 +3,8 @@ module Gitlab module ImportExport class RelationFactory + prepend_if_ee('::EE::Gitlab::ImportExport::RelationFactory') # rubocop: disable Cop/InjectEnterpriseEditionModule + OVERRIDES = { snippets: :project_snippets, ci_pipelines: 'Ci::Pipeline', pipelines: 'Ci::Pipeline', diff --git a/lib/gitlab/import_sources.rb b/lib/gitlab/import_sources.rb index e4d625b5738..58c7744fae0 100644 --- a/lib/gitlab/import_sources.rb +++ b/lib/gitlab/import_sources.rb @@ -25,6 +25,8 @@ module Gitlab ].freeze class << self + prepend_if_ee('EE::Gitlab::ImportSources') # rubocop: disable Cop/InjectEnterpriseEditionModule + def options Hash[import_table.map { |importer| [importer.title, importer.name] }] end diff --git a/lib/gitlab/metrics/dashboard/processor.rb b/lib/gitlab/metrics/dashboard/processor.rb index a33a010ad97..c0fa3bb2f3a 100644 --- a/lib/gitlab/metrics/dashboard/processor.rb +++ b/lib/gitlab/metrics/dashboard/processor.rb @@ -46,3 +46,5 @@ module Gitlab end end end + +Gitlab::Metrics::Dashboard::Processor.prepend_if_ee('EE::Gitlab::Metrics::Dashboard::Processor') diff --git a/lib/gitlab/middleware/read_only/controller.rb b/lib/gitlab/middleware/read_only/controller.rb index 802ff18fc58..a29dc5395f3 100644 --- a/lib/gitlab/middleware/read_only/controller.rb +++ b/lib/gitlab/middleware/read_only/controller.rb @@ -4,6 +4,8 @@ module Gitlab module Middleware class ReadOnly class Controller + prepend_if_ee('EE::Gitlab::Middleware::ReadOnly::Controller') # rubocop: disable Cop/InjectEnterpriseEditionModule + DISALLOWED_METHODS = %w(POST PATCH PUT DELETE).freeze APPLICATION_JSON = 'application/json' APPLICATION_JSON_TYPES = %W{#{APPLICATION_JSON} application/vnd.git-lfs+json}.freeze diff --git a/lib/gitlab/object_hierarchy.rb b/lib/gitlab/object_hierarchy.rb index c06f106ffe1..74057bbc493 100644 --- a/lib/gitlab/object_hierarchy.rb +++ b/lib/gitlab/object_hierarchy.rb @@ -198,3 +198,5 @@ module Gitlab end end end + +Gitlab::ObjectHierarchy.prepend_if_ee('EE::Gitlab::ObjectHierarchy') diff --git a/lib/gitlab/omniauth_initializer.rb b/lib/gitlab/omniauth_initializer.rb index ad1377a0892..c051a581837 100644 --- a/lib/gitlab/omniauth_initializer.rb +++ b/lib/gitlab/omniauth_initializer.rb @@ -2,6 +2,8 @@ module Gitlab class OmniauthInitializer + prepend_if_ee('::EE::Gitlab::OmniauthInitializer') # rubocop: disable Cop/InjectEnterpriseEditionModule + def initialize(devise_config) @devise_config = devise_config end diff --git a/lib/gitlab/patch/draw_route.rb b/lib/gitlab/patch/draw_route.rb index b00244a6e04..4c8ca015974 100644 --- a/lib/gitlab/patch/draw_route.rb +++ b/lib/gitlab/patch/draw_route.rb @@ -5,6 +5,8 @@ module Gitlab module Patch module DrawRoute + prepend_if_ee('EE::Gitlab::Patch::DrawRoute') # rubocop: disable Cop/InjectEnterpriseEditionModule + RoutesNotFound = Class.new(StandardError) def draw(routes_name) diff --git a/lib/gitlab/path_regex.rb b/lib/gitlab/path_regex.rb index ee2ef91c65c..9606e3e134c 100644 --- a/lib/gitlab/path_regex.rb +++ b/lib/gitlab/path_regex.rb @@ -246,3 +246,5 @@ module Gitlab end end end + +Gitlab::PathRegex.prepend_if_ee('EE::Gitlab::PathRegex') diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 394556e8708..caf0d453b6f 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -3,6 +3,7 @@ module Gitlab module Prometheus class MetricGroup + prepend_if_ee('EE::Gitlab::Prometheus::MetricGroup') # rubocop: disable Cop/InjectEnterpriseEditionModule include ActiveModel::Model attr_accessor :name, :priority, :metrics diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index 960d3536ec0..1bab2ae7d75 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -4,6 +4,8 @@ module Gitlab module Prometheus module Queries module QueryAdditionalMetrics + prepend_if_ee('EE::Gitlab::Prometheus::Queries::QueryAdditionalMetrics') # rubocop: disable Cop/InjectEnterpriseEditionModule + def query_metrics(project, environment, query_context) matched_metrics(project).map(&query_group(query_context)) .select(&method(:group_with_any_metrics)) diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb index 6636ffa448e..4bfa6f7e9a5 100644 --- a/lib/gitlab/regex.rb +++ b/lib/gitlab/regex.rb @@ -121,3 +121,5 @@ module Gitlab end end end + +Gitlab::Regex.prepend_if_ee('EE::Gitlab::Regex') diff --git a/lib/gitlab/repo_path.rb b/lib/gitlab/repo_path.rb index b4f41b9cd9a..030e50dfbf6 100644 --- a/lib/gitlab/repo_path.rb +++ b/lib/gitlab/repo_path.rb @@ -38,3 +38,5 @@ module Gitlab end end end + +Gitlab::RepoPath.singleton_class.prepend_if_ee('EE::Gitlab::RepoPath::ClassMethods') diff --git a/lib/gitlab/search/parsed_query.rb b/lib/gitlab/search/parsed_query.rb index c4fb0199558..f3136fff294 100644 --- a/lib/gitlab/search/parsed_query.rb +++ b/lib/gitlab/search/parsed_query.rb @@ -3,6 +3,8 @@ module Gitlab module Search class ParsedQuery + prepend_if_ee('EE::Gitlab::Search::ParsedQuery') # rubocop: disable Cop/InjectEnterpriseEditionModule + attr_reader :term, :filters def initialize(term, filters) diff --git a/lib/gitlab/slash_commands/presenters/issue_base.rb b/lib/gitlab/slash_commands/presenters/issue_base.rb index 08cb82274fd..0be31e234b5 100644 --- a/lib/gitlab/slash_commands/presenters/issue_base.rb +++ b/lib/gitlab/slash_commands/presenters/issue_base.rb @@ -4,6 +4,8 @@ module Gitlab module SlashCommands module Presenters module IssueBase + prepend_if_ee('EE::Gitlab::SlashCommands::Presenters::IssueBase') # rubocop: disable Cop/InjectEnterpriseEditionModule + def color(issuable) issuable.open? ? '#38ae67' : '#d22852' end diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb index 3e2bb11c35f..ee91f1200cd 100644 --- a/lib/gitlab/template/gitlab_ci_yml_template.rb +++ b/lib/gitlab/template/gitlab_ci_yml_template.rb @@ -32,3 +32,5 @@ module Gitlab end end end + +Gitlab::Template::GitlabCiYmlTemplate.prepend_if_ee('::EE::Gitlab::Template::GitlabCiYmlTemplate') diff --git a/lib/gitlab/tree_summary.rb b/lib/gitlab/tree_summary.rb index 8518a13cd1c..76018cb23c4 100644 --- a/lib/gitlab/tree_summary.rb +++ b/lib/gitlab/tree_summary.rb @@ -2,6 +2,8 @@ module Gitlab class TreeSummary + prepend_if_ee('::EE::Gitlab::TreeSummary') # rubocop: disable Cop/InjectEnterpriseEditionModule + include ::Gitlab::Utils::StrongMemoize attr_reader :commit, :project, :path, :offset, :limit diff --git a/lib/gitlab/url_blocker.rb b/lib/gitlab/url_blocker.rb index fab504aa603..4285b2675c5 100644 --- a/lib/gitlab/url_blocker.rb +++ b/lib/gitlab/url_blocker.rb @@ -45,21 +45,18 @@ module Gitlab ascii_only: ascii_only ) - normalized_hostname = uri.normalized_host - hostname = uri.hostname - port = get_port(uri) - - address_info = get_address_info(hostname, port, dns_rebind_protection) + address_info = get_address_info(uri, dns_rebind_protection) return [uri, nil] unless address_info ip_address = ip_address(address_info) - protected_uri_with_hostname = enforce_uri_hostname(ip_address, uri, hostname, dns_rebind_protection) + return [uri, nil] if domain_whitelisted?(uri) || ip_whitelisted?(ip_address) + + protected_uri_with_hostname = enforce_uri_hostname(ip_address, uri, dns_rebind_protection) # Allow url from the GitLab instance itself but only for the configured hostname and ports return protected_uri_with_hostname if internal?(uri) validate_local_request( - normalized_hostname: normalized_hostname, address_info: address_info, allow_localhost: allow_localhost, allow_local_network: allow_local_network @@ -86,12 +83,12 @@ module Gitlab # # The original hostname is used to validate the SSL, given in that scenario # we'll be making the request to the IP address, instead of using the hostname. - def enforce_uri_hostname(ip_address, uri, hostname, dns_rebind_protection) - return [uri, nil] unless dns_rebind_protection && ip_address && ip_address != hostname + def enforce_uri_hostname(ip_address, uri, dns_rebind_protection) + return [uri, nil] unless dns_rebind_protection && ip_address && ip_address != uri.hostname - uri = uri.dup - uri.hostname = ip_address - [uri, hostname] + new_uri = uri.dup + new_uri.hostname = ip_address + [new_uri, uri.hostname] end def ip_address(address_info) @@ -110,14 +107,14 @@ module Gitlab validate_unicode_restriction(uri) if ascii_only end - def get_address_info(hostname, port, dns_rebind_protection) - Addrinfo.getaddrinfo(hostname, port, nil, :STREAM).map do |addr| + def get_address_info(uri, dns_rebind_protection) + Addrinfo.getaddrinfo(uri.hostname, get_port(uri), nil, :STREAM).map do |addr| addr.ipv6_v4mapped? ? addr.ipv6_to_ipv4 : addr end rescue SocketError - # If the dns rebinding protection is not enabled, we allow - # urls that can't be resolved at this point. - return unless dns_rebind_protection + # If the dns rebinding protection is not enabled or the domain + # is whitelisted we avoid the dns rebinding checks + return if domain_whitelisted?(uri) || !dns_rebind_protection # In the test suite we use a lot of mocked urls that are either invalid or # don't exist. In order to avoid modifying a ton of tests and factories @@ -131,18 +128,11 @@ module Gitlab end def validate_local_request( - normalized_hostname:, address_info:, allow_localhost:, allow_local_network:) return if allow_local_network && allow_localhost - ip_whitelist, domain_whitelist = - Gitlab::CurrentSettings.outbound_local_requests_whitelist_arrays - - return if local_domain_whitelisted?(domain_whitelist, normalized_hostname) || - local_ip_whitelisted?(ip_whitelist, ip_address(address_info)) - unless allow_localhost validate_localhost(address_info) validate_loopback(address_info) @@ -258,14 +248,12 @@ module Gitlab (uri.port.blank? || uri.port == config.gitlab_shell.ssh_port) end - def local_ip_whitelisted?(ip_whitelist, ip_string) - ip_obj = Gitlab::Utils.string_to_ip_object(ip_string) - - ip_whitelist.any? { |ip| ip.include?(ip_obj) } + def domain_whitelisted?(uri) + Gitlab::UrlBlockers::UrlWhitelist.domain_whitelisted?(uri.normalized_host) end - def local_domain_whitelisted?(domain_whitelist, domain_string) - domain_whitelist.include?(domain_string) + def ip_whitelisted?(ip_address) + Gitlab::UrlBlockers::UrlWhitelist.ip_whitelisted?(ip_address) end def config diff --git a/lib/gitlab/url_blockers/url_whitelist.rb b/lib/gitlab/url_blockers/url_whitelist.rb new file mode 100644 index 00000000000..a0cfcbc49a3 --- /dev/null +++ b/lib/gitlab/url_blockers/url_whitelist.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Gitlab + module UrlBlockers + class UrlWhitelist + class << self + def ip_whitelisted?(ip_string) + return false if ip_string.blank? + + ip_whitelist, _ = outbound_local_requests_whitelist_arrays + ip_obj = Gitlab::Utils.string_to_ip_object(ip_string) + + ip_whitelist.any? { |ip| ip.include?(ip_obj) } + end + + def domain_whitelisted?(domain_string) + return false if domain_string.blank? + + _, domain_whitelist = outbound_local_requests_whitelist_arrays + + domain_whitelist.include?(domain_string) + end + + private + + attr_reader :ip_whitelist, :domain_whitelist + + # We cannot use Gitlab::CurrentSettings as ApplicationSetting itself + # calls this class. This ends up in a cycle where + # Gitlab::CurrentSettings creates an ApplicationSetting which then + # calls this method. + # + # See https://gitlab.com/gitlab-org/gitlab-ee/issues/9833 + def outbound_local_requests_whitelist_arrays + return [[], []] unless ApplicationSetting.current + + ApplicationSetting.current.outbound_local_requests_whitelist_arrays + end + end + end + end +end diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb index fb18c7a8554..5cd54c302fc 100644 --- a/lib/gitlab/usage_data.rb +++ b/lib/gitlab/usage_data.rb @@ -217,3 +217,5 @@ module Gitlab end end end + +Gitlab::UsageData.prepend_if_ee('EE::Gitlab::UsageData') diff --git a/lib/system_check/rake_task/app_task.rb b/lib/system_check/rake_task/app_task.rb index e98cee510ff..aec7e5f416e 100644 --- a/lib/system_check/rake_task/app_task.rb +++ b/lib/system_check/rake_task/app_task.rb @@ -37,3 +37,5 @@ module SystemCheck end end end + +SystemCheck::RakeTask::AppTask.prepend_if_ee('EE::SystemCheck::RakeTask::AppTask') diff --git a/lib/system_check/rake_task/gitlab_task.rb b/lib/system_check/rake_task/gitlab_task.rb index 7ff36fd6eb5..ae2a97c98e9 100644 --- a/lib/system_check/rake_task/gitlab_task.rb +++ b/lib/system_check/rake_task/gitlab_task.rb @@ -31,3 +31,5 @@ module SystemCheck end end end + +SystemCheck::RakeTask::GitlabTask.prepend_if_ee('EE::SystemCheck::RakeTask::GitlabTask') diff --git a/locale/ar_SA/gitlab.po b/locale/ar_SA/gitlab.po index 8e8a678fb49..fd2be81c476 100644 --- a/locale/ar_SA/gitlab.po +++ b/locale/ar_SA/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ar\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:58\n" +"PO-Revision-Date: 2019-06-18 11:42\n" msgid " Please sign in." msgstr "" diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 6ac32a51c4a..9e3d97343fa 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: bg\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:59\n" +"PO-Revision-Date: 2019-06-18 11:43\n" msgid " Please sign in." msgstr "" diff --git a/locale/bn_BD/gitlab.po b/locale/bn_BD/gitlab.po index ed6daeb61cf..aa3e12a795f 100644 --- a/locale/bn_BD/gitlab.po +++ b/locale/bn_BD/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: bn\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:59\n" +"PO-Revision-Date: 2019-06-18 11:42\n" msgid " Please sign in." msgstr "" diff --git a/locale/bn_IN/gitlab.po b/locale/bn_IN/gitlab.po index 82a88455eb6..de83f07be4e 100644 --- a/locale/bn_IN/gitlab.po +++ b/locale/bn_IN/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: bn-IN\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:59\n" +"PO-Revision-Date: 2019-06-18 11:42\n" msgid " Please sign in." msgstr "" diff --git a/locale/ca_ES/gitlab.po b/locale/ca_ES/gitlab.po index 7f85efb992b..d1c0418d21d 100644 --- a/locale/ca_ES/gitlab.po +++ b/locale/ca_ES/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ca\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:59\n" +"PO-Revision-Date: 2019-06-18 11:43\n" msgid " Please sign in." msgstr "" diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po index 3e51d44aea9..d504b45c395 100644 --- a/locale/cs_CZ/gitlab.po +++ b/locale/cs_CZ/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: cs\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:58\n" +"PO-Revision-Date: 2019-06-18 11:45\n" msgid " Please sign in." msgstr "" diff --git a/locale/cy_GB/gitlab.po b/locale/cy_GB/gitlab.po index ac295b22014..49eab6a83bd 100644 --- a/locale/cy_GB/gitlab.po +++ b/locale/cy_GB/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: cy\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:03\n" +"PO-Revision-Date: 2019-06-18 11:47\n" msgid " Please sign in." msgstr "" diff --git a/locale/da_DK/gitlab.po b/locale/da_DK/gitlab.po index 697d555d4f5..080ed7751e4 100644 --- a/locale/da_DK/gitlab.po +++ b/locale/da_DK/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: da\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:01\n" +"PO-Revision-Date: 2019-06-18 11:45\n" msgid " Please sign in." msgstr "" diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po index d8355c1a73b..8d8803cc2bc 100644 --- a/locale/de/gitlab.po +++ b/locale/de/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: de\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:03\n" +"PO-Revision-Date: 2019-06-18 11:47\n" msgid " Please sign in." msgstr " Bitte melde dich an." diff --git a/locale/el_GR/gitlab.po b/locale/el_GR/gitlab.po index 02262e56399..5ca04aeb14f 100644 --- a/locale/el_GR/gitlab.po +++ b/locale/el_GR/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: el\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:03\n" +"PO-Revision-Date: 2019-06-18 11:44\n" msgid " Please sign in." msgstr "" diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po index efac588a37b..a596c854125 100644 --- a/locale/eo/gitlab.po +++ b/locale/eo/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: eo\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:01\n" +"PO-Revision-Date: 2019-06-18 11:45\n" msgid " Please sign in." msgstr "" diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po index d29d12c7f19..2bb35469c83 100644 --- a/locale/es/gitlab.po +++ b/locale/es/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: es-ES\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:56\n" +"PO-Revision-Date: 2019-06-18 11:39\n" msgid " Please sign in." msgstr " Por favor, inicie sesión." diff --git a/locale/et_EE/gitlab.po b/locale/et_EE/gitlab.po index e8cdb077a90..d55f6904dc6 100644 --- a/locale/et_EE/gitlab.po +++ b/locale/et_EE/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: et\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:02\n" +"PO-Revision-Date: 2019-06-18 11:46\n" msgid " Please sign in." msgstr "" diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po index 0ed26efcd80..ede7329449f 100644 --- a/locale/fil_PH/gitlab.po +++ b/locale/fil_PH/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: fil\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:02\n" +"PO-Revision-Date: 2019-06-18 11:29\n" msgid " Please sign in." msgstr "" diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po index e0945260d76..485e3e9e60e 100644 --- a/locale/fr/gitlab.po +++ b/locale/fr/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: fr\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:02\n" +"PO-Revision-Date: 2019-06-18 11:46\n" msgid " Please sign in." msgstr "" diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 81ff65a0c5e..5aa9e795c64 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -28,15 +28,45 @@ msgstr "" msgid " You need to do this before %{grace_period_deadline}." msgstr "" +msgid " and" +msgstr "" + msgid " and " msgstr "" msgid " and %{sliced}" msgstr "" +msgid " degraded on %d point" +msgid_plural " degraded on %d points" +msgstr[0] "" +msgstr[1] "" + +msgid " improved on %d point" +msgid_plural " improved on %d points" +msgstr[0] "" +msgstr[1] "" + msgid " or " msgstr "" +msgid " or <!merge request id>" +msgstr "" + +msgid " or <#epic id>" +msgstr "" + +msgid " or <#issue id>" +msgstr "" + +msgid " or references (e.g. path/to/project!merge_request_id)" +msgstr "" + +msgid "%d comment" +msgid_plural "%d comments" +msgstr[0] "" +msgstr[1] "" + msgid "%d commit" msgid_plural "%d commits" msgstr[0] "" @@ -75,11 +105,21 @@ msgid_plural "%d fixed test results" msgstr[0] "" msgstr[1] "" +msgid "%d inaccessible merge request" +msgid_plural "%d inaccessible merge requests" +msgstr[0] "" +msgstr[1] "" + msgid "%d issue" msgid_plural "%d issues" msgstr[0] "" msgstr[1] "" +msgid "%d issue selected" +msgid_plural "%d issues selected" +msgstr[0] "" +msgstr[1] "" + msgid "%d layer" msgid_plural "%d layers" msgstr[0] "" @@ -90,6 +130,11 @@ msgid_plural "%d merge requests" msgstr[0] "" msgstr[1] "" +msgid "%d merge request that you don't have access to." +msgid_plural "%d merge requests that you don't have access to." +msgstr[0] "" +msgstr[1] "" + msgid "%d metric" msgid_plural "%d metrics" msgstr[0] "" @@ -128,20 +173,48 @@ msgstr[1] "" msgid "%{actionText} & %{openOrClose} %{noteable}" msgstr "" +msgid "%{authorsName}'s thread" +msgstr "" + msgid "%{commit_author_link} authored %{commit_timeago}" msgstr "" +msgid "%{count} LOC/commit" +msgstr "" + +msgid "%{count} approval required from %{name}" +msgid_plural "%{count} approvals required from %{name}" +msgstr[0] "" +msgstr[1] "" + +msgid "%{count} approvals from %{name}" +msgstr "" + +msgid "%{count} files touched" +msgstr "" + msgid "%{count} more" msgstr "" msgid "%{count} more assignees" msgstr "" +msgid "%{count} of %{required} approvals from %{name}" +msgstr "" + +msgid "%{count} of %{total}" +msgstr "" + msgid "%{count} participant" msgid_plural "%{count} participants" msgstr[0] "" msgstr[1] "" +msgid "%{count} pending comment" +msgid_plural "%{count} pending comments" +msgstr[0] "" +msgstr[1] "" + msgid "%{duration}ms" msgstr "" @@ -157,6 +230,9 @@ msgstr "" msgid "%{edit_in_new_fork_notice} Try to upload a file again." msgstr "" +msgid "%{extra} more downstream pipelines" +msgstr "" + msgid "%{filePath} deleted" msgstr "" @@ -169,6 +245,9 @@ msgstr "" msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects." msgstr "" +msgid "%{group_name} uses group managed accounts. You need to create a new GitLab account which will be managed by %{group_name}." +msgstr "" + msgid "%{icon}You are about to add %{usersTag} people to the discussion. Proceed with caution." msgstr "" @@ -211,6 +290,9 @@ msgstr "" msgid "%{name} found %{resultsString}" msgstr "" +msgid "%{name}'s avatar" +msgstr "" + msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgstr "" @@ -241,6 +323,9 @@ msgstr "" msgid "%{spammable_titlecase} was submitted to Akismet successfully." msgstr "" +msgid "%{state} epics" +msgstr "" + msgid "%{strong_start}%{branch_count}%{strong_end} Branch" msgid_plural "%{strong_start}%{branch_count}%{strong_end} Branches" msgstr[0] "" @@ -270,6 +355,9 @@ msgstr[1] "" msgid "%{text} is available" msgstr "" +msgid "%{title} %{operator} %{threshold}" +msgstr "" + msgid "%{title} changes" msgstr "" @@ -303,9 +391,23 @@ msgstr "" msgid "'%{source}' is not a import source" msgstr "" +msgid "(%d closed)" +msgid_plural "(%d closed)" +msgstr[0] "" +msgstr[1] "" + +msgid "(%{mrCount} merged)" +msgstr "" + +msgid "(No changes)" +msgstr "" + msgid "(Show all)" msgstr "" +msgid "(check progress)" +msgstr "" + msgid "(external source)" msgstr "" @@ -324,6 +426,9 @@ msgstr "" msgid "+ %{numberOfHiddenAssignees} more" msgstr "" +msgid "+%{extraOptionCount} more" +msgstr "" + msgid ", or " msgstr "" @@ -349,6 +454,11 @@ msgid_plural "%{count} %{type} modifications" msgstr[0] "" msgstr[1] "" +msgid "1 Day" +msgid_plural "%d Days" +msgstr[0] "" +msgstr[1] "" + msgid "1 closed issue" msgid_plural "%{issues} closed issues" msgstr[0] "" @@ -362,6 +472,11 @@ msgstr[1] "" msgid "1 day" msgstr "" +msgid "1 group" +msgid_plural "%d groups" +msgstr[0] "" +msgstr[1] "" + msgid "1 merged merge request" msgid_plural "%{merge_requests} merged merge requests" msgstr[0] "" @@ -382,6 +497,16 @@ msgid_plural "%d pipelines" msgstr[0] "" msgstr[1] "" +msgid "1 role" +msgid_plural "%d roles" +msgstr[0] "" +msgstr[1] "" + +msgid "1 user" +msgid_plural "%d users" +msgstr[0] "" +msgstr[1] "" + msgid "1 week" msgstr "" @@ -454,9 +579,18 @@ msgstr "" msgid "<strong>%{changedFilesLength} unstaged</strong> and <strong>%{stagedFilesLength} staged</strong> changes" msgstr "" +msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted." +msgstr "" + +msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed." +msgstr "" + msgid "<strong>%{group_name}</strong> group members" msgstr "" +msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors." +msgstr "" + msgid "<strong>Deletes</strong> source branch" msgstr "" @@ -529,6 +663,9 @@ msgstr "" msgid "API Token" msgstr "" +msgid "Abort" +msgstr "" + msgid "About GitLab" msgstr "" @@ -538,6 +675,9 @@ msgstr "" msgid "About auto deploy" msgstr "" +msgid "About this feature" +msgstr "" + msgid "Abuse Reports" msgstr "" @@ -550,6 +690,9 @@ msgstr "" msgid "Accept terms" msgstr "" +msgid "Accepted MR" +msgstr "" + msgid "Access Tokens" msgstr "" @@ -568,6 +711,15 @@ msgstr "" msgid "Access to '%{classification_label}' not allowed" msgstr "" +msgid "AccessDropdown|Groups" +msgstr "" + +msgid "AccessDropdown|Roles" +msgstr "" + +msgid "AccessDropdown|Users" +msgstr "" + msgid "AccessTokens|Access Tokens" msgstr "" @@ -637,6 +789,12 @@ msgstr "" msgid "Account: %{account}" msgstr "" +msgid "Action to take when receiving an alert." +msgstr "" + +msgid "Activate Service Desk" +msgstr "" + msgid "Active" msgstr "" @@ -649,6 +807,9 @@ msgstr "" msgid "Activity" msgstr "" +msgid "Add" +msgstr "" + msgid "Add %d issue" msgid_plural "Add %d issues" msgstr[0] "" @@ -660,6 +821,15 @@ msgstr "" msgid "Add CONTRIBUTING" msgstr "" +msgid "Add GitLab to Slack" +msgstr "" + +msgid "Add Group Webhooks and GitLab Enterprise Edition." +msgstr "" + +msgid "Add Jaeger URL" +msgstr "" + msgid "Add Kubernetes cluster" msgstr "" @@ -702,12 +872,27 @@ msgstr "" msgid "Add a task list" msgstr "" +msgid "Add additional text to appear in all email communications. %{character_limit} character limit" +msgstr "" + msgid "Add an SSH key" msgstr "" +msgid "Add an issue" +msgstr "" + +msgid "Add approval rule" +msgstr "" + +msgid "Add approvers" +msgstr "" + msgid "Add bold text" msgstr "" +msgid "Add child epic to an epic" +msgstr "" + msgid "Add comment now" msgstr "" @@ -750,6 +935,18 @@ msgstr "" msgid "Add reaction" msgstr "" +msgid "Add to Slack" +msgstr "" + +msgid "Add to epic" +msgstr "" + +msgid "Add to merge train" +msgstr "" + +msgid "Add to merge train when pipeline succeeds" +msgstr "" + msgid "Add to project" msgstr "" @@ -774,27 +971,45 @@ msgstr "" msgid "Added" msgstr "" +msgid "Added %{epic_ref} as child epic." +msgstr "" + msgid "Added %{label_references} %{label_text}." msgstr "" msgid "Added a To Do." msgstr "" +msgid "Added an issue to an epic." +msgstr "" + msgid "Added at" msgstr "" msgid "Adding new applications is disabled in your GitLab instance. Please contact your GitLab administrator to get the permission" msgstr "" +msgid "Additional minutes" +msgstr "" + +msgid "Additional text" +msgstr "" + msgid "Adds" msgstr "" +msgid "Adds %{epic_ref} as child epic." +msgstr "" + msgid "Adds %{labels} %{label_text}." msgstr "" msgid "Adds a To Do." msgstr "" +msgid "Adds an issue to an epic." +msgstr "" + msgid "Admin Area" msgstr "" @@ -804,6 +1019,9 @@ msgstr "" msgid "Admin Section" msgstr "" +msgid "Admin notes" +msgstr "" + msgid "AdminArea| You are about to permanently delete the user %{username}. Issues, merge requests, and groups linked to them will be transferred to a system-wide \"Ghost-user\". To avoid data loss, consider using the %{strong_start}block user%{strong_end} feature instead. Once you %{strong_start}Delete user%{strong_end}, it cannot be undone or recovered." msgstr "" @@ -828,6 +1046,9 @@ msgstr "" msgid "AdminDashboard|Error loading the statistics. Please try again" msgstr "" +msgid "AdminNote|Note" +msgstr "" + msgid "AdminProjects| You’re about to permanently delete the project %{projectName}, its repository, and all related resources including issues, merge requests, etc.. Once you confirm and press %{strong_start}Delete project%{strong_end}, it cannot be undone or recovered." msgstr "" @@ -849,9 +1070,27 @@ msgstr "" msgid "AdminSettings|Environment variables are protected by default" msgstr "" +msgid "AdminSettings|No required pipeline" +msgstr "" + +msgid "AdminSettings|Required pipeline configuration" +msgstr "" + +msgid "AdminSettings|Select a pipeline configuration file" +msgstr "" + +msgid "AdminSettings|Select a template" +msgstr "" + +msgid "AdminSettings|Set an instance-wide auto included %{link_start}pipeline configuration%{link_end}. This pipeline configuration will be run after the project's own configuration." +msgstr "" + msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages." msgstr "" +msgid "AdminSettings|The required pipeline configuration can be selected from the %{code_start}gitlab-ci%{code_end} directory inside of the configured %{link_start}instance template repository%{link_end} or from GitLab provided configurations." +msgstr "" + msgid "AdminSettings|When creating a new environment variable it will be protected by default." msgstr "" @@ -933,6 +1172,9 @@ msgstr "" msgid "AdminUsers|Search users" msgstr "" +msgid "AdminUsers|Send email to users" +msgstr "" + msgid "AdminUsers|Sort by" msgstr "" @@ -954,6 +1196,9 @@ msgstr "" msgid "Advanced permissions, Large File Storage and Two-Factor authentication settings." msgstr "" +msgid "Advanced search functionality" +msgstr "" + msgid "Advanced settings" msgstr "" @@ -963,21 +1208,41 @@ msgstr "" msgid "After a successful password update, you will be redirected to the login page where you can log in with your new password." msgstr "" +msgid "Alert" +msgid_plural "Alerts" +msgstr[0] "" +msgstr[1] "" + +msgid "AlertService|%{linkStart}Learn more%{linkEnd} about configuring this endpoint to receive alerts." +msgstr "" + +msgid "AlertService|Each alert source must be authorized using the following URL and authorization key." +msgstr "" + msgid "Alerts" msgstr "" msgid "All" msgstr "" +msgid "All Members" +msgstr "" + msgid "All changes are committed" msgstr "" +msgid "All cross-project dependencies have merged" +msgstr "" + msgid "All email addresses will be used to identify your commits." 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 "All groups and projects" +msgstr "" + msgid "All issues for this milestone are closed. You may close this milestone now." msgstr "" @@ -993,9 +1258,15 @@ msgstr "" msgid "All users must have a name." msgstr "" +msgid "Allow \"%{group_name}\" to sign you in" +msgstr "" + msgid "Allow commits from members who can merge to the target branch." msgstr "" +msgid "Allow group owners to manage LDAP-related settings" +msgstr "" + msgid "Allow mirrors to be set up for projects" msgstr "" @@ -1032,15 +1303,27 @@ msgstr "" msgid "Allow users to request access if visibility is public or internal." msgstr "" +msgid "Allowed email domain restriction only permitted for top-level groups" +msgstr "" + msgid "Allowed to fail" msgstr "" msgid "Allows you to add and manage Kubernetes clusters." msgstr "" +msgid "Also called \"Issuer\" or \"Relying party trust identifier\"" +msgstr "" + +msgid "Also called \"Relying party service URL\" or \"Reply URL\"" +msgstr "" + msgid "Alternate support URL for help page and help dropdown" msgstr "" +msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect." +msgstr "" + msgid "Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication" msgstr "" @@ -1053,9 +1336,21 @@ msgstr "" msgid "An error has occurred" msgstr "" +msgid "An error occurred adding a draft to the thread." +msgstr "" + +msgid "An error occurred adding a new draft." +msgstr "" + msgid "An error occurred creating the new branch." msgstr "" +msgid "An error occurred fetching the approval rules." +msgstr "" + +msgid "An error occurred fetching the approvers for the new rule." +msgstr "" + msgid "An error occurred fetching the dropdown data." msgstr "" @@ -1071,30 +1366,57 @@ msgstr "" msgid "An error occurred when trying to resolve a discussion. Please try again." msgstr "" +msgid "An error occurred when updating the issue weight" +msgstr "" + +msgid "An error occurred while deleting the approvers group" +msgstr "" + +msgid "An error occurred while deleting the comment" +msgstr "" + msgid "An error occurred while detecting host keys" msgstr "" +msgid "An error occurred while disabling Service Desk." +msgstr "" + msgid "An error occurred while dismissing the alert. Refresh the page and try again." msgstr "" msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again." msgstr "" +msgid "An error occurred while enabling Service Desk." +msgstr "" + +msgid "An error occurred while fetching environments." +msgstr "" + msgid "An error occurred while fetching folder content." msgstr "" +msgid "An error occurred while fetching issues." +msgstr "" + msgid "An error occurred while fetching label colors." msgstr "" msgid "An error occurred while fetching markdown preview" msgstr "" +msgid "An error occurred while fetching pending comments" +msgstr "" + msgid "An error occurred while fetching projects autocomplete." msgstr "" msgid "An error occurred while fetching sidebar data" msgstr "" +msgid "An error occurred while fetching the Service Desk address." +msgstr "" + msgid "An error occurred while fetching the board lists. Please try again." msgstr "" @@ -1125,9 +1447,18 @@ msgstr "" msgid "An error occurred while importing project: %{details}" msgstr "" +msgid "An error occurred while initializing path locks" +msgstr "" + +msgid "An error occurred while loading chart data" +msgstr "" + msgid "An error occurred while loading commit signatures" msgstr "" +msgid "An error occurred while loading designs. Please try again." +msgstr "" + msgid "An error occurred while loading diff" msgstr "" @@ -1137,6 +1468,9 @@ msgstr "" msgid "An error occurred while loading the file" msgstr "" +msgid "An error occurred while loading the subscription details." +msgstr "" + msgid "An error occurred while making the request." msgstr "" @@ -1146,24 +1480,51 @@ msgstr "" msgid "An error occurred while parsing recent searches" msgstr "" +msgid "An error occurred while removing epics." +msgstr "" + +msgid "An error occurred while removing issues." +msgstr "" + msgid "An error occurred while rendering preview broadcast message" msgstr "" +msgid "An error occurred while reordering issues." +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 saving the approval settings" +msgstr "" + +msgid "An error occurred while subscribing to notifications." +msgstr "" + msgid "An error occurred while triggering the job." msgstr "" msgid "An error occurred while trying to run a new pipeline for this Merge Request." msgstr "" +msgid "An error occurred while unsubscribing to notifications." +msgstr "" + +msgid "An error occurred while updating approvers" +msgstr "" + +msgid "An error occurred while updating the comment" +msgstr "" + msgid "An error occurred while validating username" msgstr "" @@ -1206,6 +1567,30 @@ msgstr "" msgid "An issue can be a bug, a todo or a feature request that needs to be discussed in a project. Besides, issues are searchable and filterable." msgstr "" +msgid "An unexpected error occurred while checking the project environment." +msgstr "" + +msgid "An unexpected error occurred while checking the project runners." +msgstr "" + +msgid "An unexpected error occurred while communicating with the Web Terminal." +msgstr "" + +msgid "An unexpected error occurred while starting the Web Terminal." +msgstr "" + +msgid "An unexpected error occurred while stopping the Web Terminal." +msgstr "" + +msgid "Analytics" +msgstr "" + +msgid "Analytics|Timeframe" +msgstr "" + +msgid "Ancestors" +msgstr "" + msgid "Anonymous" msgstr "" @@ -1227,6 +1612,9 @@ msgstr "" msgid "Any namespace" msgstr "" +msgid "Any user" +msgstr "" + msgid "Appearance" msgstr "" @@ -1269,6 +1657,9 @@ msgstr "" msgid "Applied" msgstr "" +msgid "Apply a label" +msgstr "" + msgid "Apply suggestion" msgstr "" @@ -1284,6 +1675,62 @@ msgstr "" msgid "Applying suggestion" msgstr "" +msgid "ApprovalRuleRemove|%d member" +msgid_plural "ApprovalRuleRemove|%d members" +msgstr[0] "" +msgstr[1] "" + +msgid "ApprovalRuleRemove|Approvals from this member are not revoked." +msgid_plural "ApprovalRuleRemove|Approvals from these members are not revoked." +msgstr[0] "" +msgstr[1] "" + +msgid "ApprovalRuleRemove|You are about to remove the %{name} approver group which has %{nMembers}." +msgstr "" + +msgid "ApprovalRuleSummary|%d member" +msgid_plural "ApprovalRuleSummary|%d members" +msgstr[0] "" +msgstr[1] "" + +msgid "ApprovalRuleSummary|%{count} approval required from %{membersCount}" +msgid_plural "ApprovalRuleSummary|%{count} approvals required from %{membersCount}" +msgstr[0] "" +msgstr[1] "" + +msgid "ApprovalRule|All members with Developer role or higher and code owners (if any)" +msgstr "" + +msgid "ApprovalRule|Approvers" +msgstr "" + +msgid "ApprovalRule|Name" +msgstr "" + +msgid "ApprovalRule|No. approvals required" +msgstr "" + +msgid "ApprovalRule|Rule name" +msgstr "" + +msgid "ApprovalRule|e.g. QA, Security, etc." +msgstr "" + +msgid "Approvals" +msgstr "" + +msgid "Approve" +msgstr "" + +msgid "Approve a merge request" +msgstr "" + +msgid "Approve the current merge request." +msgstr "" + +msgid "Approved the current merge request." +msgstr "" + msgid "Apr" msgstr "" @@ -1344,6 +1791,9 @@ msgstr "" msgid "Are you sure you want to lose your issue information?" msgstr "" +msgid "Are you sure you want to permanently delete this license?" +msgstr "" + msgid "Are you sure you want to regenerate the public key? You will have to update the public key on the remote server before mirroring will work again." msgstr "" @@ -1359,6 +1809,9 @@ msgstr "" msgid "Are you sure you want to reset registration token?" msgstr "" +msgid "Are you sure you want to reset the SCIM token? SCIM provisioning will stop working until the new token is updated." +msgstr "" + msgid "Are you sure you want to reset the health check token?" msgstr "" @@ -1371,6 +1824,9 @@ msgstr "" msgid "Are you sure you want to stop this environment?" msgstr "" +msgid "Are you sure you want to unlock %{path_lock_path}?" +msgstr "" + msgid "Are you sure you want to unsubscribe from the %{type}: %{link_to_noteable_text}?" msgstr "" @@ -1386,6 +1842,9 @@ msgstr "" msgid "Are you sure? This will invalidate your registered applications and U2F devices." msgstr "" +msgid "Artifact ID" +msgstr "" + msgid "Artifacts" msgstr "" @@ -1404,9 +1863,15 @@ msgstr "" msgid "AsanaService|User Personal Access Token. User must have access to task, all comments will be attributed to this user." msgstr "" +msgid "Ascending" +msgstr "" + msgid "Ask your group maintainer to set up a group Runner." msgstr "" +msgid "Assertion consumer service URL" +msgstr "" + msgid "Assets" msgstr "" @@ -1416,6 +1881,9 @@ msgstr "" msgid "Assign custom color like #FF0000" msgstr "" +msgid "Assign epic" +msgstr "" + msgid "Assign labels" msgstr "" @@ -1451,12 +1919,21 @@ msgid_plural "%d Assignees" msgstr[0] "" msgstr[1] "" +msgid "Assignee lists not available with your current license" +msgstr "" + +msgid "Assignee lists show all issues assigned to the selected user." +msgstr "" + msgid "Assignee(s)" msgstr "" msgid "Assigns %{assignee_users_sentence}." msgstr "" +msgid "At least one approval from a code owner is required to change files matching the respective CODEOWNER rules." +msgstr "" + msgid "Attach a file" msgstr "" @@ -1471,6 +1948,12 @@ msgstr[1] "" msgid "Attaching the file failed." msgstr "" +msgid "Audit Events" +msgstr "" + +msgid "Audit Events is a way to keep track of important events that happened in GitLab." +msgstr "" + msgid "Aug" msgstr "" @@ -1507,6 +1990,9 @@ msgstr "" msgid "Authorization code:" msgstr "" +msgid "Authorization key" +msgstr "" + msgid "Authorization was granted by entering your username and password in the application." msgstr "" @@ -1537,6 +2023,9 @@ msgstr "" msgid "Auto DevOps, runners and job artifacts" msgstr "" +msgid "Auto License Compliance" +msgstr "" + msgid "Auto-cancel redundant, pending pipelines" msgstr "" @@ -1582,6 +2071,9 @@ msgstr "" msgid "Automatically resolved" msgstr "" +msgid "Automatically update this project's branches and tags from the upstream repository every hour." +msgstr "" + msgid "Autosave|Note" msgstr "" @@ -1696,6 +2188,9 @@ msgstr "" msgid "Badges|e.g. %{exampleUrl}" msgstr "" +msgid "Badge|New" +msgstr "" + msgid "Balsamiq file could not be loaded." msgstr "" @@ -1717,6 +2212,15 @@ msgstr "" msgid "BambooService|You must set up automatic revision labeling and a repository trigger in Bamboo." msgstr "" +msgid "BatchComments|Delete all pending comments" +msgstr "" + +msgid "BatchComments|Discard review?" +msgstr "" + +msgid "BatchComments|You're about to discard your review which will delete all of your pending comments. The deleted comments %{strong_start}cannot%{strong_end} be restored." +msgstr "" + msgid "Be careful. Changing the project's namespace can have unintended side effects." msgstr "" @@ -1732,6 +2236,72 @@ msgstr "" msgid "Below you will find all the groups that are public." msgstr "" +msgid "Billing" +msgstr "" + +msgid "BillingPlans|%{group_name} is currently using the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|@%{user_name} you are currently using the %{plan_link} plan." +msgstr "" + +msgid "BillingPlans|Current plan" +msgstr "" + +msgid "BillingPlans|Downgrade" +msgstr "" + +msgid "BillingPlans|If you would like to downgrade your plan please contact %{support_link_start}Customer Support%{support_link_end}." +msgstr "" + +msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold." +msgstr "" + +msgid "BillingPlans|Learn more about each plan by visiting our %{pricing_page_link}." +msgstr "" + +msgid "BillingPlans|Manage plan" +msgstr "" + +msgid "BillingPlans|Pricing page" +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|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}" +msgstr "" + +msgid "BillingPlans|Your GitLab.com trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}." +msgstr "" + +msgid "BillingPlans|features" +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 "BillingPlan|Upgrade plan" +msgstr "" + msgid "Bitbucket Server Import" msgstr "" @@ -1747,12 +2317,18 @@ msgstr "" msgid "Blog" msgstr "" +msgid "Blue helpers indicate an action to be taken." +msgstr "" + msgid "Board name" msgstr "" msgid "Board scope" msgstr "" +msgid "Board scope affects which issues are displayed for anyone who visits this board" +msgstr "" + msgid "BoardBlankState|Add default lists" msgstr "" @@ -1771,9 +2347,15 @@ msgstr "" msgid "Boards|Collapse" msgstr "" +msgid "Boards|Edit board" +msgstr "" + msgid "Boards|Expand" msgstr "" +msgid "Boards|View scope" +msgstr "" + msgid "Branch %{branchName} was not found in this project's repository." msgstr "" @@ -1888,6 +2470,9 @@ msgstr "" msgid "Branches|Stale branches" 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 "" @@ -1900,9 +2485,15 @@ 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 "" @@ -1930,9 +2521,36 @@ msgstr "" msgid "Browse files" msgstr "" +msgid "Built-in" +msgstr "" + +msgid "BurndownChartLabel|Guideline" +msgstr "" + +msgid "BurndownChartLabel|Open issue weight" +msgstr "" + +msgid "BurndownChartLabel|Open issues" +msgstr "" + +msgid "BurndownChartLabel|Progress" +msgstr "" + +msgid "BurndownChartLabel|Remaining" +msgstr "" + +msgid "Business" +msgstr "" + msgid "Business metrics (Custom)" msgstr "" +msgid "Buy EE" +msgstr "" + +msgid "Buy GitLab Enterprise Edition" +msgstr "" + msgid "By %{user_name}" msgstr "" @@ -1963,12 +2581,18 @@ msgstr "" msgid "CI variables" msgstr "" +msgid "CI will run using the credentials assigned above." +msgstr "" + msgid "CI/CD" msgstr "" msgid "CI/CD configuration" msgstr "" +msgid "CI/CD for external repo" +msgstr "" + msgid "CI/CD settings" msgstr "" @@ -2026,15 +2650,24 @@ msgstr "" msgid "Callback URL" msgstr "" +msgid "Can override approvers and approvals required per merge request" +msgstr "" + msgid "Can't find HEAD commit for this branch" msgstr "" msgid "Can't find variable: ZiteReader" msgstr "" +msgid "Can't remove group members without group managed account" +msgstr "" + msgid "Can't scan the code?" msgstr "" +msgid "Canary Deployments is a popular CI strategy, where a small portion of the fleet is updated to the new version of your application." +msgstr "" + msgid "Cancel" msgstr "" @@ -2074,15 +2707,27 @@ msgstr "" msgid "Cannot skip two factor authentication setup" msgstr "" +msgid "Capacity threshold" +msgstr "" + msgid "Certificate" msgstr "" msgid "Certificate (PEM)" msgstr "" +msgid "Change Weight" +msgstr "" + msgid "Change assignee" msgstr "" +msgid "Change assignee(s)" +msgstr "" + +msgid "Change assignee(s)." +msgstr "" + msgid "Change label" msgstr "" @@ -2125,6 +2770,9 @@ msgstr "" msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes." msgstr "" +msgid "Changed assignee(s)." +msgstr "" + msgid "Changed the title to \"%{title_param}\"." msgstr "" @@ -2140,6 +2788,9 @@ msgstr "" msgid "Changes the title to \"%{title_param}\"." msgstr "" +msgid "Changes won't take place until the index is %{link_start}recreated%{link_end}." +msgstr "" + msgid "Charts" msgstr "" @@ -2200,6 +2851,9 @@ msgstr "" msgid "Check again" msgstr "" +msgid "Check feature availability on namespace plan" +msgstr "" + msgid "Check the %{docs_link_start}documentation%{docs_link_end}." msgstr "" @@ -2209,6 +2863,9 @@ msgstr "" msgid "Checking %{text} availability…" msgstr "" +msgid "Checking approval status" +msgstr "" + msgid "Checking branch availability..." msgstr "" @@ -2233,6 +2890,9 @@ msgstr "" msgid "Choose a file" msgstr "" +msgid "Choose a group" +msgstr "" + msgid "Choose a role permission" msgstr "" @@ -2260,6 +2920,15 @@ msgstr "" msgid "Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions." msgstr "" +msgid "Choose what content you want to see on a group’s overview page" +msgstr "" + +msgid "Choose which repositories you want to connect and run CI/CD pipelines." +msgstr "" + +msgid "Choose which shards you wish to synchronize to this secondary node." +msgstr "" + msgid "CiStatusLabel|canceled" msgstr "" @@ -2407,6 +3076,9 @@ msgstr "" msgid "Clear" msgstr "" +msgid "Clear input" +msgstr "" + msgid "Clear recent searches" msgstr "" @@ -2419,9 +3091,21 @@ msgstr "" msgid "Clear templates search input" msgstr "" +msgid "Clear weight" +msgstr "" + +msgid "Cleared weight." +msgstr "" + +msgid "Clears weight." +msgstr "" + msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone." msgstr "" +msgid "Click here" +msgstr "" + msgid "Click the <strong>Download</strong> button and wait for downloading to complete." msgstr "" @@ -2434,6 +3118,9 @@ msgstr "" msgid "Click the button below to begin the install process by navigating to the Kubernetes page" msgstr "" +msgid "Click the image where you'd like to start a new discussion" +msgstr "" + msgid "Click to expand it." msgstr "" @@ -2461,6 +3148,9 @@ msgstr "" msgid "Clone with %{http_label}" msgstr "" +msgid "Clone with KRB5" +msgstr "" + msgid "Clone with SSH" msgstr "" @@ -2470,6 +3160,9 @@ msgstr "" msgid "Close %{tabname}" msgstr "" +msgid "Close epic" +msgstr "" + msgid "Close milestone" msgstr "" @@ -2482,12 +3175,21 @@ msgstr "" msgid "Closed" msgstr "" +msgid "Closed issues" +msgstr "" + msgid "Closed this %{quick_action_target}." msgstr "" msgid "Closes this %{quick_action_target}." msgstr "" +msgid "Cluster %{cluster} was used." +msgstr "" + +msgid "Cluster Health" +msgstr "" + msgid "ClusterIntegration| %{custom_domain_start}More information%{custom_domain_end}." msgstr "" @@ -2599,6 +3301,9 @@ msgstr "" msgid "ClusterIntegration|Choose which of your environments will use this cluster." msgstr "" +msgid "ClusterIntegration|Cluster health" +msgstr "" + msgid "ClusterIntegration|Cluster name is required." msgstr "" @@ -2704,6 +3409,12 @@ msgstr "" msgid "ClusterIntegration|Hide" msgstr "" +msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}." +msgstr "" + +msgid "ClusterIntegration|In order to view the health of your cluster, you must first install Prometheus below." +msgstr "" + msgid "ClusterIntegration|Ingress" msgstr "" @@ -3022,12 +3733,27 @@ msgstr "" msgid "Code" msgstr "" +msgid "Code Owners" +msgstr "" + +msgid "Code owner approval is required" +msgstr "" + +msgid "Code owners" +msgstr "" + +msgid "CodeOwner|Pattern" +msgstr "" + msgid "Cohorts" msgstr "" msgid "Collapse" msgstr "" +msgid "Collapse approvers" +msgstr "" + msgid "Collapse sidebar" msgstr "" @@ -3147,6 +3873,9 @@ msgstr "" msgid "Commit…" msgstr "" +msgid "Company" +msgstr "" + msgid "Compare" msgstr "" @@ -3180,12 +3909,21 @@ msgstr "" msgid "CompareBranches|There isn't anything to compare." msgstr "" +msgid "Complete" +msgstr "" + msgid "Confidential" msgstr "" msgid "Confidentiality" msgstr "" +msgid "Configuration" +msgstr "" + +msgid "Configure GitLab runners to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}" +msgstr "" + msgid "Configure Gitaly timeouts." msgstr "" @@ -3195,6 +3933,12 @@ msgstr "" msgid "Configure Prometheus" msgstr "" +msgid "Configure Tracing" +msgstr "" + +msgid "Configure a <code>.gitlab-webide.yml</code> file in the <code>.gitlab</code> directory to start using the Web Terminal. %{helpStart}Learn more.%{helpEnd}" +msgstr "" + msgid "Configure automatic git checks and housekeeping on repositories." msgstr "" @@ -3231,12 +3975,36 @@ msgstr "" msgid "Connect" msgstr "" +msgid "Connect all repositories" +msgstr "" + msgid "Connect repositories from GitHub" msgstr "" +msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled." +msgstr "" + +msgid "Connecting to terminal sync service" +msgstr "" + +msgid "Connecting..." +msgstr "" + msgid "Connection failure" msgstr "" +msgid "Contact an owner of group %{namespace_name} to upgrade the plan." +msgstr "" + +msgid "Contact owner %{link_start}%{owner_name}%{link_end} to upgrade the plan." +msgstr "" + +msgid "Contact sales to upgrade" +msgstr "" + +msgid "Contact your Administrator to upgrade your license." +msgstr "" + msgid "Container Registry" msgstr "" @@ -3311,6 +4079,9 @@ msgstr "" msgid "ContainerRegistry|You can add an image to this registry with the following commands:" msgstr "" +msgid "Contains %{count} blobs of images (%{size})" +msgstr "" + msgid "Contents of .gitlab-ci.yml" msgstr "" @@ -3338,6 +4109,9 @@ msgstr "" msgid "Contributions for <strong>%{calendar_date}</strong>" msgstr "" +msgid "Contributions per group member" +msgstr "" + msgid "Contributors" msgstr "" @@ -3359,6 +4133,9 @@ msgstr "" msgid "Control the display of third party offers." msgstr "" +msgid "Control the maximum concurrency of repository backfill for this secondary node" +msgstr "" + msgid "ConvDev Index" msgstr "" @@ -3377,9 +4154,15 @@ msgstr "" msgid "Copy %{protocol} clone URL" msgstr "" +msgid "Copy %{proxy_url} to clipboard" +msgstr "" + msgid "Copy ID to clipboard" msgstr "" +msgid "Copy KRB5 clone URL" +msgstr "" + msgid "Copy SSH clone URL" msgstr "" @@ -3443,6 +4226,9 @@ msgstr "" msgid "Could not connect to FogBugz, check your URL" msgstr "" +msgid "Could not connect to Web IDE file mirror service." +msgstr "" + msgid "Could not create Wiki Repository at this time. Please try again later." msgstr "" @@ -3488,6 +4274,9 @@ msgstr "" msgid "Create a GitLab account first, and then connect it to your %{label} account." msgstr "" +msgid "Create a local proxy for storing frequently used upstream images. %{link_start}Learn more%{link_end} about dependency proxies." +msgstr "" + msgid "Create a merge request" msgstr "" @@ -3506,6 +4295,9 @@ msgstr "" msgid "Create a personal access token on your account to pull or push via %{protocol}." msgstr "" +msgid "Create an issue. Issues are created for each alert triggered." +msgstr "" + msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import." msgstr "" @@ -3530,6 +4322,9 @@ msgstr "" msgid "Create empty repository" msgstr "" +msgid "Create epic" +msgstr "" + msgid "Create file" msgstr "" @@ -3608,6 +4403,18 @@ msgstr "" msgid "Created by me" msgstr "" +msgid "Created issue %{issueLink}" +msgstr "" + +msgid "Created issue %{issueLink} at %{projectLink}" +msgstr "" + +msgid "Created merge request %{mergeRequestLink}" +msgstr "" + +msgid "Created merge request %{mergeRequestLink} at %{projectLink}" +msgstr "" + msgid "Created on" msgstr "" @@ -3620,6 +4427,9 @@ msgstr "" msgid "Creates branch '%{branch_name}' and a merge request to resolve this issue." msgstr "" +msgid "Creating epic" +msgstr "" + msgid "Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available." msgstr "" @@ -3629,9 +4439,18 @@ msgstr "" msgid "Cron syntax" msgstr "" +msgid "Cross-project dependencies" +msgstr "" + msgid "Current Branch" msgstr "" +msgid "Current Project" +msgstr "" + +msgid "Current node" +msgstr "" + msgid "Current password" msgstr "" @@ -3653,6 +4472,15 @@ 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 "Custom project templates" +msgstr "" + +msgid "Custom project templates have not been set up for groups that you are a member of. They are enabled from a group’s settings page. Contact your group’s Owner or Maintainer to setup custom project templates." +msgstr "" + +msgid "CustomCycleAnalytics|Add a stage" +msgstr "" + msgid "Customize colors" msgstr "" @@ -3677,6 +4505,9 @@ msgstr "" msgid "Cycle Analytics" msgstr "" +msgid "Cycle Analytics can help you determine your team’s velocity" +msgstr "" + msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project." msgstr "" @@ -3725,6 +4556,31 @@ msgstr "" msgid "CycleAnalyticsStage|Test" msgstr "" +msgid "CycleAnalytics|%{projectName}" +msgid_plural "CycleAnalytics|%d projects selected" +msgstr[0] "" +msgstr[1] "" + +msgid "CycleAnalytics|%{stageName}" +msgid_plural "CycleAnalytics|%d stages selected" +msgstr[0] "" +msgstr[1] "" + +msgid "CycleAnalytics|All stages" +msgstr "" + +msgid "CycleAnalytics|Stages" +msgstr "" + +msgid "CycleAnalytics|group dropdown filter" +msgstr "" + +msgid "CycleAnalytics|project dropdown filter" +msgstr "" + +msgid "CycleAnalytics|stage dropdown" +msgstr "" + msgid "DNS" msgstr "" @@ -3740,6 +4596,18 @@ msgstr "" msgid "DashboardProjects|Trending" msgstr "" +msgid "Dashboards" +msgstr "" + +msgid "Dashboard|%{firstProject} and %{secondProject}" +msgstr "" + +msgid "Dashboard|%{firstProject}, %{rest}, and %{secondProject}" +msgstr "" + +msgid "Dashboard|Unable to add %{invalidProjects}. This dashboard is available for public projects, and private projects in groups with a Silver plan." +msgstr "" + msgid "Data is still calculating..." msgstr "" @@ -3758,6 +4626,12 @@ msgstr "" msgid "DayTitle|W" msgstr "" +msgid "Days" +msgstr "" + +msgid "Days to merge" +msgstr "" + msgid "Debug" msgstr "" @@ -3782,12 +4656,24 @@ msgstr "" msgid "Default classification label" msgstr "" +msgid "Default description template for issues" +msgstr "" + +msgid "Default description template for merge requests" +msgstr "" + msgid "Default first day of the week" msgstr "" msgid "Default first day of the week in calendars and date pickers." msgstr "" +msgid "Default issue template" +msgstr "" + +msgid "Default project deletion protection" +msgstr "" + msgid "Default: Directly import the Google Code email address or username" msgstr "" @@ -3818,6 +4704,12 @@ msgstr "" msgid "Delete" msgstr "" +msgid "Delete Comment" +msgstr "" + +msgid "Delete Package" +msgstr "" + msgid "Delete Snippet" msgstr "" @@ -3827,6 +4719,9 @@ msgstr "" msgid "Delete comment" msgstr "" +msgid "Delete license" +msgstr "" + msgid "Delete list" msgstr "" @@ -3857,12 +4752,107 @@ msgstr "" msgid "Deleted chat nickname: %{chat_name}!" msgstr "" +msgid "Deleting the license failed." +msgstr "" + +msgid "Deleting the license failed. The license was not found." +msgstr "" + +msgid "Deleting the license failed. You are not permitted to perform this action." +msgstr "" + msgid "Denied authorization of chat nickname %{user_name}." msgstr "" msgid "Deny" msgstr "" +msgid "Dependencies" +msgstr "" + +msgid "Dependencies|%d additional vulnerability not shown" +msgid_plural "Dependencies|%d additional vulnerabilities not shown" +msgstr[0] "" +msgstr[1] "" + +msgid "Dependencies|%d vulnerability" +msgid_plural "Dependencies|%d vulnerabilities" +msgstr[0] "" +msgstr[1] "" + +msgid "Dependencies|%{remainingLicensesCount} more" +msgstr "" + +msgid "Dependencies|All" +msgstr "" + +msgid "Dependencies|Component" +msgstr "" + +msgid "Dependencies|Component name" +msgstr "" + +msgid "Dependencies|Export as JSON" +msgstr "" + +msgid "Dependencies|Job failed to generate the dependency list" +msgstr "" + +msgid "Dependencies|License" +msgstr "" + +msgid "Dependencies|Location" +msgstr "" + +msgid "Dependencies|Packager" +msgstr "" + +msgid "Dependencies|Safe" +msgstr "" + +msgid "Dependencies|Status" +msgstr "" + +msgid "Dependencies|The %{codeStartTag}dependency_scanning%{codeEndTag} job has failed and cannot generate the list. Please ensure the job is running properly and run the pipeline again." +msgstr "" + +msgid "Dependencies|Unsupported file(s) detected" +msgstr "" + +msgid "Dependencies|Version" +msgstr "" + +msgid "Dependencies|Vulnerable components" +msgstr "" + +msgid "Dependency List" +msgstr "" + +msgid "Dependency Proxy" +msgstr "" + +msgid "Dependency proxy" +msgstr "" + +msgid "Dependency proxy URL" +msgstr "" + +msgid "Dependency proxy feature is limited to public groups for now." +msgstr "" + +msgid "DependencyProxy|Toggle Dependency Proxy" +msgstr "" + +msgid "Depends on %d merge request being merged" +msgid_plural "Depends on %d merge requests being merged" +msgstr[0] "" +msgstr[1] "" + +msgid "Depends on <strong>%d closed</strong> merge request." +msgid_plural "Depends on <strong>%d closed</strong> merge requests." +msgstr[0] "" +msgstr[1] "" + msgid "Deploy" msgid_plural "Deploys" msgstr[0] "" @@ -3874,9 +4864,15 @@ msgstr "" msgid "Deploy key was successfully updated." msgstr "" +msgid "Deploy progress not found. To see pods, ensure your environment matches %{linkStart}deploy board criteria%{linkEnd}." +msgstr "" + msgid "Deploy to..." msgstr "" +msgid "DeployBoard|Matching on the %{appLabel} label has been removed for deploy boards. To see all instances on your board, you must update your chart and redeploy." +msgstr "" + msgid "DeployKeys|+%{count} others" msgstr "" @@ -4015,9 +5011,18 @@ msgstr "" msgid "Deprioritize label" msgstr "" +msgid "Descending" +msgstr "" + msgid "Description" msgstr "" +msgid "Description parsed with %{link_start}GitLab Flavored Markdown%{link_end}" +msgstr "" + +msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." +msgstr "" + msgid "Description:" msgstr "" @@ -4027,12 +5032,66 @@ msgstr "" msgid "Deselect all" msgstr "" +msgid "DesignManagement|%{current_design} of %{designs_count}" +msgstr "" + +msgid "DesignManagement|Add designs" +msgstr "" + +msgid "DesignManagement|Adding a design with the same filename replaces the file in a new version." +msgstr "" + +msgid "DesignManagement|An error occurred while loading designs. Please try again." +msgstr "" + +msgid "DesignManagement|Could not add a new comment. Please try again" +msgstr "" + +msgid "DesignManagement|Could not create new discussion, please try again." +msgstr "" + +msgid "DesignManagement|Could not find design, please try again." +msgstr "" + +msgid "DesignManagement|Error uploading a new design. Please try again" +msgstr "" + +msgid "DesignManagement|Go back to designs" +msgstr "" + +msgid "DesignManagement|Go to next design" +msgstr "" + +msgid "DesignManagement|Go to previous design" +msgstr "" + +msgid "DesignManagement|Requested design version does not exist" +msgstr "" + +msgid "DesignManagement|Requested design version does not exist. Showing latest version instead" +msgstr "" + +msgid "DesignManagement|The maximum number of designs allowed to be uploaded is %{upload_limit}. Please try again." +msgstr "" + +msgid "DesignManagement|The one place for your designs" +msgstr "" + +msgid "DesignManagement|Upload and view the latest designs for this issue. Consistent and easy to find, so everyone is up to date." +msgstr "" + +msgid "Designs" +msgstr "" + msgid "Destroy" msgstr "" msgid "Details" msgstr "" +msgid "Details (default)" +msgstr "" + msgid "Detect host keys" msgstr "" @@ -4102,12 +5161,18 @@ msgstr "" msgid "Discard draft" msgstr "" +msgid "Discard review" +msgstr "" + msgid "DiscordService|Discord Notifications" msgstr "" msgid "DiscordService|Receive event notifications in Discord" msgstr "" +msgid "Discover GitLab Geo" +msgstr "" + msgid "Discover projects, groups and snippets. Share your projects with others" msgstr "" @@ -4135,6 +5200,24 @@ msgstr "" msgid "Dismiss Cycle Analytics introduction box" msgstr "" +msgid "Dismiss Merge Request promotion" +msgstr "" + +msgid "Dismiss trial promotion" +msgstr "" + +msgid "Dismissed" +msgstr "" + +msgid "Dismissed at %{projectLink}" +msgstr "" + +msgid "Dismissed on pipeline %{pipelineLink}" +msgstr "" + +msgid "Dismissed on pipeline %{pipelineLink} at %{projectLink}" +msgstr "" + msgid "Display name" msgstr "" @@ -4144,6 +5227,9 @@ msgstr "" msgid "Dockerfile" msgstr "" +msgid "Documentation for popular identity providers" +msgstr "" + msgid "Doing" msgstr "" @@ -4159,6 +5245,9 @@ msgstr "" msgid "Don't show again" msgstr "" +msgid "Don't worry, you can access this tour by clicking on the help icon in the top right corner and choose <strong>Learn GitLab</strong>." +msgstr "" + msgid "Done" msgstr "" @@ -4186,6 +5275,9 @@ msgstr "" msgid "Download image" msgstr "" +msgid "Download license" +msgstr "" + msgid "Download source code" msgstr "" @@ -4201,18 +5293,33 @@ msgstr "" msgid "DownloadSource|Download" msgstr "" +msgid "Downstream" +msgstr "" + msgid "Downvotes" msgstr "" msgid "Due date" msgstr "" +msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below." +msgstr "" + msgid "Each Runner can be in one of the following states:" msgstr "" msgid "Edit" msgstr "" +msgid "Edit %{issuable}" +msgstr "" + +msgid "Edit %{name}" +msgstr "" + +msgid "Edit Comment" +msgstr "" + msgid "Edit Deploy Key" msgstr "" @@ -4279,9 +5386,33 @@ msgstr "" msgid "Editing" msgstr "" +msgid "Elasticsearch" +msgstr "" + +msgid "Elasticsearch indexing restrictions" +msgstr "" + +msgid "Elasticsearch indexing started" +msgstr "" + +msgid "Elasticsearch integration. Elasticsearch AWS IAM." +msgstr "" + +msgid "Elastic|None. Select namespaces to index." +msgstr "" + +msgid "Elastic|None. Select projects to index." +msgstr "" + msgid "Email" msgstr "" +msgid "Email address" +msgstr "" + +msgid "Email domain is not editable in subgroups. Value inherited from top-level parent group." +msgstr "" + msgid "Email patch" msgstr "" @@ -4360,6 +5491,12 @@ msgstr "" msgid "Enable HTML emails" msgstr "" +msgid "Enable Pseudonymizer data collection" +msgstr "" + +msgid "Enable SAML authentication for this group" +msgstr "" + msgid "Enable access to Grafana" msgstr "" @@ -4396,9 +5533,15 @@ msgstr "" msgid "Enable mirror configuration" msgstr "" +msgid "Enable or disable the Pseudonymizer data collection." +msgstr "" + msgid "Enable or disable version check and usage ping." msgstr "" +msgid "Enable proxy" +msgstr "" + msgid "Enable reCAPTCHA or Akismet and set IP limits. For reCAPTCHA, we currently only support %{recaptcha_v2_link_start}v2%{recaptcha_v2_link_end}" msgstr "" @@ -4417,6 +5560,9 @@ msgstr "" msgid "Enable usage ping to get an overview of how you are using GitLab from a feature perspective." msgstr "" +msgid "Enable/disable your service desk. %{link_start}Learn more about service desk%{link_end}." +msgstr "" + msgid "Enabled" msgstr "" @@ -4426,6 +5572,12 @@ msgstr "" msgid "Enabled sources for code import during project creation. OmniAuth must be configured for GitHub" msgstr "" +msgid "Enabling this will only make licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public." +msgstr "" + +msgid "End date" +msgstr "" + msgid "Ends at (UTC)" msgstr "" @@ -4435,18 +5587,33 @@ msgstr "" msgid "Ensure connectivity is available from the GitLab server to the Prometheus server" msgstr "" +msgid "Ensure your %{linkStart}environment is part of the deploy stage%{linkEnd} of your CI pipeline to track deployments to your cluster." +msgstr "" + +msgid "Enter IP address range" +msgstr "" + +msgid "Enter a number" +msgstr "" + msgid "Enter at least three characters to search" msgstr "" msgid "Enter board name" msgstr "" +msgid "Enter domain" +msgstr "" + msgid "Enter in your Bitbucket Server URL and personal access token below" msgstr "" msgid "Enter in your Phabricator Server URL and personal access token below" msgstr "" +msgid "Enter merge request URLs" +msgstr "" + msgid "Enter the issue description" msgstr "" @@ -4459,9 +5626,18 @@ msgstr "" msgid "Enter the merge request title" msgstr "" +msgid "Enter your password to approve" +msgstr "" + msgid "Enter zen mode" msgstr "" +msgid "EnviornmentDashboard|You are looking at the last updated environment" +msgstr "" + +msgid "Environment" +msgstr "" + msgid "Environment variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. Additionally, they can be masked so they are hidden in job logs, though they must match certain regexp requirements to do so. You can use environment variables for passwords, secret keys, or whatever you want." msgstr "" @@ -4474,9 +5650,33 @@ msgstr "" msgid "Environments" msgstr "" +msgid "Environments Dashboard" +msgstr "" + msgid "Environments allow you to track deployments of your application %{link_to_read_more}." msgstr "" +msgid "EnvironmentsDashboard|Add a project to the dashboard" +msgstr "" + +msgid "EnvironmentsDashboard|Add projects" +msgstr "" + +msgid "EnvironmentsDashboard|Environments Dashboard" +msgstr "" + +msgid "EnvironmentsDashboard|Job: %{job}" +msgstr "" + +msgid "EnvironmentsDashboard|More actions" +msgstr "" + +msgid "EnvironmentsDashboard|Remove" +msgstr "" + +msgid "EnvironmentsDashboard|The environments dashboard provides a summary of each project's environments' status, including pipeline and alert statuses." +msgstr "" + msgid "Environments|An error occurred while fetching the environments." msgstr "" @@ -4525,6 +5725,9 @@ msgstr "" msgid "Environments|No deployments yet" msgstr "" +msgid "Environments|No pod name has been specified" +msgstr "" + msgid "Environments|Note that this action will stop the environment, but it will %{emphasisStart}not%{emphasisEnd} have an effect on any existing deployment due to no “stop environment action” being defined in the %{ciConfigLinkStart}.gitlab-ci.yml%{ciConfigLinkEnd} file." msgstr "" @@ -4534,6 +5737,9 @@ msgstr "" msgid "Environments|Open live environment" msgstr "" +msgid "Environments|Pod logs from" +msgstr "" + msgid "Environments|Re-deploy" msgstr "" @@ -4597,9 +5803,84 @@ msgstr "" msgid "Epic" msgstr "" +msgid "Epics" +msgstr "" + msgid "Epics (Ultimate / Gold license only)" msgstr "" +msgid "Epics Roadmap" +msgstr "" + +msgid "Epics let you manage your portfolio of projects more efficiently and with less effort" +msgstr "" + +msgid "Epics|%{epicsCount} epics and %{issuesCount} issues" +msgstr "" + +msgid "Epics|Add an epic" +msgstr "" + +msgid "Epics|Add an existing epic as a child epic." +msgstr "" + +msgid "Epics|An error occurred while saving the %{epicDateType} date" +msgstr "" + +msgid "Epics|Are you sure you want to remove %{bStart}%{targetIssueTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}?" +msgstr "" + +msgid "Epics|Create an epic within this group and add it as a child epic." +msgstr "" + +msgid "Epics|Create new epic" +msgstr "" + +msgid "Epics|How can I solve this?" +msgstr "" + +msgid "Epics|More information" +msgstr "" + +msgid "Epics|Remove epic" +msgstr "" + +msgid "Epics|Remove issue" +msgstr "" + +msgid "Epics|Show more" +msgstr "" + +msgid "Epics|Something went wrong while assigning issue to epic." +msgstr "" + +msgid "Epics|Something went wrong while creating child epics." +msgstr "" + +msgid "Epics|Something went wrong while fetching child epics." +msgstr "" + +msgid "Epics|Something went wrong while fetching group epics." +msgstr "" + +msgid "Epics|Something went wrong while removing issue from epic." +msgstr "" + +msgid "Epics|These dates affect how your epics appear in the roadmap. Dates from milestones come from the milestones assigned to issues in the epic. You can also set fixed dates or remove them entirely." +msgstr "" + +msgid "Epics|This will also remove any descendents of %{bStart}%{targetEpicTitle}%{bEnd} from %{bStart}%{parentEpicTitle}%{bEnd}. Are you sure?" +msgstr "" + +msgid "Epics|To schedule your epic's %{epicDateType} date based on milestones, assign a milestone with a %{epicDateType} date to any issue in the epic." +msgstr "" + +msgid "Epics|due" +msgstr "" + +msgid "Epics|start" +msgstr "" + msgid "Error" msgstr "" @@ -4609,6 +5890,9 @@ msgstr "" msgid "Error creating a new path" msgstr "" +msgid "Error creating epic" +msgstr "" + msgid "Error deleting %{issuableType}" msgstr "" @@ -4633,6 +5917,9 @@ msgstr "" msgid "Error fetching refs" msgstr "" +msgid "Error fetching the dependency list. Please check your network connection and try again." +msgstr "" + msgid "Error fetching usage ping data." msgstr "" @@ -4642,6 +5929,9 @@ msgstr "" msgid "Error loading branches." msgstr "" +msgid "Error loading burndown chart data" +msgstr "" + msgid "Error loading file viewer." msgstr "" @@ -4678,6 +5968,9 @@ msgstr "" msgid "Error occurred when toggling the notification subscription" msgstr "" +msgid "Error occurred while updating the issue weight" +msgstr "" + msgid "Error occurred. User was not blocked" msgstr "" @@ -4822,6 +6115,9 @@ msgstr "" msgid "Everything you need to create a GitLab Pages site using plain HTML." msgstr "" +msgid "Example: Usage = single query. (Requested) / (Capacity) = multiple queries combined into a formula." +msgstr "" + msgid "Except policy:" msgstr "" @@ -4837,6 +6133,9 @@ msgstr "" msgid "Expand all" msgstr "" +msgid "Expand approvers" +msgstr "" + msgid "Expand down" msgstr "" @@ -4852,6 +6151,9 @@ msgstr "" msgid "Expiration date" msgstr "" +msgid "Expired" +msgstr "" + msgid "Expired %{expiredOn}" msgstr "" @@ -4885,6 +6187,12 @@ msgstr "" msgid "Explore public groups" msgstr "" +msgid "Export as CSV" +msgstr "" + +msgid "Export issues" +msgstr "" + msgid "Export project" msgstr "" @@ -4999,6 +6307,9 @@ msgstr "" msgid "Failed to load errors from Sentry. Error message: %{errorMessage}" msgstr "" +msgid "Failed to load groups & users." +msgstr "" + msgid "Failed to load related branches" msgstr "" @@ -5017,6 +6328,12 @@ msgstr "" msgid "Failed to promote label due to internal error. Please contact administrators." msgstr "" +msgid "Failed to protect the branch" +msgstr "" + +msgid "Failed to protect the environment" +msgstr "" + msgid "Failed to remove issue from board, please try again." msgstr "" @@ -5032,6 +6349,9 @@ msgstr "" msgid "Failed to remove user key." msgstr "" +msgid "Failed to reset key. Please try again." +msgstr "" + msgid "Failed to save comment!" msgstr "" @@ -5050,9 +6370,15 @@ msgstr "" msgid "Failed to set due date because the date format is invalid." msgstr "" +msgid "Failed to signing using smartcard authentication" +msgstr "" + msgid "Failed to update branch!" msgstr "" +msgid "Failed to update environment!" +msgstr "" + msgid "Failed to update issues, please try again." msgstr "" @@ -5083,12 +6409,177 @@ msgstr "" msgid "Favicon was successfully removed." msgstr "" +msgid "Feature Flags" +msgstr "" + +msgid "Feature flag was not removed." +msgstr "" + +msgid "Feature flag was successfully removed." +msgstr "" + +msgid "FeatureFlags|* (All Environments)" +msgstr "" + +msgid "FeatureFlags|* (All environments)" +msgstr "" + +msgid "FeatureFlags|API URL" +msgstr "" + +msgid "FeatureFlags|Active" +msgstr "" + +msgid "FeatureFlags|Add" +msgstr "" + +msgid "FeatureFlags|All users" +msgstr "" + +msgid "FeatureFlags|Clear all" +msgstr "" + +msgid "FeatureFlags|Configure" +msgstr "" + +msgid "FeatureFlags|Configure feature flags" +msgstr "" + +msgid "FeatureFlags|Create feature flag" +msgstr "" + +msgid "FeatureFlags|Delete %{name}?" +msgstr "" + +msgid "FeatureFlags|Delete feature flag" +msgstr "" + +msgid "FeatureFlags|Description" +msgstr "" + +msgid "FeatureFlags|Edit Feature Flag" +msgstr "" + +msgid "FeatureFlags|Enter comma separated list of user IDs" +msgstr "" + +msgid "FeatureFlags|Environment Spec" +msgstr "" + +msgid "FeatureFlags|Environment Specs" +msgstr "" + +msgid "FeatureFlags|Feature Flag" +msgstr "" + +msgid "FeatureFlags|Feature Flag behavior is built up by creating a set of rules to define the status of target environments. A default wildcard rule %{codeStart}*%{codeEnd} for %{boldStart}All Environments%{boldEnd} is set, and you are able to add as many rules as you need by choosing environment specs below. You can toggle the behavior for each of your rules to set them %{boldStart}Active%{boldEnd} or %{boldStart}Inactive%{boldEnd}." +msgstr "" + +msgid "FeatureFlags|Feature Flags" +msgstr "" + +msgid "FeatureFlags|Feature flag %{name} will be removed. Are you sure?" +msgstr "" + +msgid "FeatureFlags|Feature flags allow you to configure your code into different flavors by dynamically toggling certain functionality." +msgstr "" + +msgid "FeatureFlags|Get started with feature flags" +msgstr "" + +msgid "FeatureFlags|Inactive" +msgstr "" + +msgid "FeatureFlags|Inactive flag for %{scope}" +msgstr "" + +msgid "FeatureFlags|Install a %{docs_link_anchored_start}compatible client library%{docs_link_anchored_end} and specify the API URL, application name, and instance ID during the configuration setup. %{docs_link_start}More Information%{docs_link_end}" +msgstr "" + +msgid "FeatureFlags|Instance ID" +msgstr "" + +msgid "FeatureFlags|Loading feature flags" +msgstr "" + +msgid "FeatureFlags|More information" +msgstr "" + +msgid "FeatureFlags|Name" +msgstr "" + +msgid "FeatureFlags|New" +msgstr "" + +msgid "FeatureFlags|New Feature Flag" +msgstr "" + +msgid "FeatureFlags|New feature flag" +msgstr "" + +msgid "FeatureFlags|Percent rollout (logged in users)" +msgstr "" + +msgid "FeatureFlags|Percent rollout must be a whole number between 0 and 100" +msgstr "" + +msgid "FeatureFlags|Protected" +msgstr "" + +msgid "FeatureFlags|Remove" +msgstr "" + +msgid "FeatureFlags|Rollout Percentage" +msgstr "" + +msgid "FeatureFlags|Rollout Strategy" +msgstr "" + +msgid "FeatureFlags|Status" +msgstr "" + +msgid "FeatureFlags|Target Users" +msgstr "" + +msgid "FeatureFlags|Target environments" +msgstr "" + +msgid "FeatureFlags|Target user behaviour is built up by creating a list of active user IDs. These IDs should be the users in the system in which the feature flag is set, not GitLab ids. Target users apply across %{strong_start}All Environments%{strong_end} and are not affected by Target Environment rules." +msgstr "" + +msgid "FeatureFlags|There are no active feature flags" +msgstr "" + +msgid "FeatureFlags|There are no inactive feature flags" +msgstr "" + +msgid "FeatureFlags|There was an error fetching the feature flags." +msgstr "" + +msgid "FeatureFlags|Try again in a few moments or contact your support team." +msgstr "" + +msgid "FeatureFlags|User IDs" +msgstr "" + msgid "Feb" msgstr "" msgid "February" msgstr "" +msgid "Fetching incoming email" +msgstr "" + +msgid "Fetching licenses failed." +msgstr "" + +msgid "Fetching licenses failed. The request endpoint was not found." +msgstr "" + +msgid "Fetching licenses failed. You are not permitted to perform this action." +msgstr "" + msgid "File" msgid_plural "Files" msgstr[0] "" @@ -5124,9 +6615,18 @@ msgstr "" msgid "Files, directories, and submodules in the path %{path} for commit reference %{ref}" msgstr "" +msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>" +msgstr "" + msgid "Filter" msgstr "" +msgid "Filter by %{issuable_type} that are currently closed." +msgstr "" + +msgid "Filter by %{issuable_type} that are currently opened." +msgstr "" + msgid "Filter by commit message" msgstr "" @@ -5175,12 +6675,30 @@ msgstr "" msgid "Finish editing this message first!" msgstr "" +msgid "Finish review" +msgstr "" + +msgid "Finish setting up your dedicated account for <strong>%{group_name}</strong>." +msgstr "" + msgid "Finished" msgstr "" msgid "First day of the week" msgstr "" +msgid "Fixed date" +msgstr "" + +msgid "Fixed due date" +msgstr "" + +msgid "Fixed start date" +msgstr "" + +msgid "Fixed:" +msgstr "" + msgid "FlowdockService|Flowdock Git source token" msgstr "" @@ -5214,6 +6732,15 @@ msgstr "" msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)" msgstr "" +msgid "For more info, read the documentation." +msgstr "" + +msgid "For more information, go to the " +msgstr "" + +msgid "For more information, please review %{link_start_tag}Jaeger's configuration doc%{link_end_tag}" +msgstr "" + msgid "For more information, see the documentation on %{deactivating_usage_ping_link_start}deactivating the usage ping%{deactivating_usage_ping_link_end}." msgstr "" @@ -5253,12 +6780,21 @@ msgstr "" msgid "Format" msgstr "" +msgid "Forward external support email address to" +msgstr "" + msgid "Found errors in your %{gitlab_ci_yml}:" msgstr "" msgid "Found errors in your .gitlab-ci.yml:" msgstr "" +msgid "Free Trial" +msgstr "" + +msgid "Free Trial of GitLab.com Gold" +msgstr "" + msgid "Friday" msgstr "" @@ -5289,6 +6825,9 @@ msgstr "" msgid "From merge request merge until deploy to production" msgstr "" +msgid "From milestones:" +msgstr "" + msgid "From the Kubernetes cluster details view, install Runner from the applications list" msgstr "" @@ -5319,6 +6858,9 @@ msgstr "" msgid "Generate a default set of labels" msgstr "" +msgid "Generate key" +msgstr "" + msgid "Generate link to chart" msgstr "" @@ -5328,6 +6870,408 @@ msgstr "" msgid "Geo" msgstr "" +msgid "Geo Nodes" +msgstr "" + +msgid "Geo allows you to replicate your GitLab instance to other geographical locations." +msgstr "" + +msgid "GeoNodeStatusEvent|%{timeAgoStr} (%{pendingEvents} events)" +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|Checksummed" +msgstr "" + +msgid "GeoNodes|Data is out of date from %{timeago}" +msgstr "" + +msgid "GeoNodes|Data replication lag" +msgstr "" + +msgid "GeoNodes|Does not match the primary storage configuration" +msgstr "" + +msgid "GeoNodes|Failed" +msgstr "" + +msgid "GeoNodes|Full" +msgstr "" + +msgid "GeoNodes|GitLab version" +msgstr "" + +msgid "GeoNodes|GitLab version does not match the primary node version" +msgstr "" + +msgid "GeoNodes|Health status" +msgstr "" + +msgid "GeoNodes|Internal URL" +msgstr "" + +msgid "GeoNodes|Last event ID processed by cursor" +msgstr "" + +msgid "GeoNodes|Last event ID seen from primary" +msgstr "" + +msgid "GeoNodes|Learn more about Repository checksum progress" +msgstr "" + +msgid "GeoNodes|Learn more about Repository verification" +msgstr "" + +msgid "GeoNodes|Learn more about Wiki checksum progress" +msgstr "" + +msgid "GeoNodes|Learn more about Wiki verification" +msgstr "" + +msgid "GeoNodes|Loading nodes" +msgstr "" + +msgid "GeoNodes|Local LFS objects" +msgstr "" + +msgid "GeoNodes|Local attachments" +msgstr "" + +msgid "GeoNodes|Local container repositories" +msgstr "" + +msgid "GeoNodes|Local job artifacts" +msgstr "" + +msgid "GeoNodes|New node" +msgstr "" + +msgid "GeoNodes|Node Authentication was successfully repaired." +msgstr "" + +msgid "GeoNodes|Node was successfully removed." +msgstr "" + +msgid "GeoNodes|Not checksummed" +msgstr "" + +msgid "GeoNodes|Out of sync" +msgstr "" + +msgid "GeoNodes|Pausing replication stops the sync process." +msgstr "" + +msgid "GeoNodes|Removing a primary node stops the sync process for all nodes. Syncing cannot be resumed without losing some data on all secondaries. In this case we would recommend setting up all nodes from scratch. Are you sure?" +msgstr "" + +msgid "GeoNodes|Removing a secondary node stops the sync process. It is not currently possible to add back the same node without losing some data. We only recommend setting up a new secondary node in this case. Are you sure?" +msgstr "" + +msgid "GeoNodes|Replication slot WAL" +msgstr "" + +msgid "GeoNodes|Replication slots" +msgstr "" + +msgid "GeoNodes|Repositories" +msgstr "" + +msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes" +msgstr "" + +msgid "GeoNodes|Repositories verified with their counterparts on the Primary node" +msgstr "" + +msgid "GeoNodes|Repository checksum progress" +msgstr "" + +msgid "GeoNodes|Repository verification progress" +msgstr "" + +msgid "GeoNodes|Selective" +msgstr "" + +msgid "GeoNodes|Something went wrong while changing node status" +msgstr "" + +msgid "GeoNodes|Something went wrong while fetching nodes" +msgstr "" + +msgid "GeoNodes|Something went wrong while removing node" +msgstr "" + +msgid "GeoNodes|Something went wrong while repairing node" +msgstr "" + +msgid "GeoNodes|Storage config" +msgstr "" + +msgid "GeoNodes|Sync settings" +msgstr "" + +msgid "GeoNodes|Synced" +msgstr "" + +msgid "GeoNodes|Unused slots" +msgstr "" + +msgid "GeoNodes|Unverified" +msgstr "" + +msgid "GeoNodes|Used slots" +msgstr "" + +msgid "GeoNodes|Verified" +msgstr "" + +msgid "GeoNodes|Wiki checksum progress" +msgstr "" + +msgid "GeoNodes|Wiki verification progress" +msgstr "" + +msgid "GeoNodes|Wikis" +msgstr "" + +msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes" +msgstr "" + +msgid "GeoNodes|Wikis verified with their counterparts on the Primary node" +msgstr "" + +msgid "GeoNodes|With %{geo} you can install a special read-only and replicated instance anywhere. Before you add nodes, follow the %{instructions} in the exact order they appear." +msgstr "" + +msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS." +msgstr "" + +msgid "Geo|%{name} is scheduled for forced re-download" +msgstr "" + +msgid "Geo|%{name} is scheduled for re-sync" +msgstr "" + +msgid "Geo|%{name} is scheduled for re-verify" +msgstr "" + +msgid "Geo|All" +msgstr "" + +msgid "Geo|All projects" +msgstr "" + +msgid "Geo|All projects are being scheduled for re-sync" +msgstr "" + +msgid "Geo|All projects are being scheduled for re-verify" +msgstr "" + +msgid "Geo|Allow this secondary node to replicate content on Object Storage" +msgstr "" + +msgid "Geo|Batch operations" +msgstr "" + +msgid "Geo|Choose which groups you wish to synchronize to this secondary node." +msgstr "" + +msgid "Geo|Container repositories sync capacity" +msgstr "" + +msgid "Geo|Control the maximum concurrency of LFS/attachment backfill for this secondary node" +msgstr "" + +msgid "Geo|Control the maximum concurrency of container repository operations for this Geo node" +msgstr "" + +msgid "Geo|Control the maximum concurrency of verification operations for this Geo node" +msgstr "" + +msgid "Geo|Control the minimum interval in days that a repository should be reverified for this primary node" +msgstr "" + +msgid "Geo|Could not remove tracking entry for an existing project." +msgstr "" + +msgid "Geo|Could not remove tracking entry for an existing upload." +msgstr "" + +msgid "Geo|Failed" +msgstr "" + +msgid "Geo|File sync capacity" +msgstr "" + +msgid "Geo|Geo Status" +msgstr "" + +msgid "Geo|Groups to synchronize" +msgstr "" + +msgid "Geo|If enabled, and if object storage is enabled, GitLab will handle Object Storage replication using Geo" +msgstr "" + +msgid "Geo|In sync" +msgstr "" + +msgid "Geo|Internal URL (optional)" +msgstr "" + +msgid "Geo|Last repository check run" +msgstr "" + +msgid "Geo|Last successful sync" +msgstr "" + +msgid "Geo|Last sync attempt" +msgstr "" + +msgid "Geo|Last time verified" +msgstr "" + +msgid "Geo|Never" +msgstr "" + +msgid "Geo|Next sync scheduled at" +msgstr "" + +msgid "Geo|Not synced yet" +msgstr "" + +msgid "Geo|Pending" +msgstr "" + +msgid "Geo|Pending synchronization" +msgstr "" + +msgid "Geo|Pending verification" +msgstr "" + +msgid "Geo|Please refer to Geo Troubleshooting." +msgstr "" + +msgid "Geo|Project" +msgstr "" + +msgid "Geo|Project (ID: %{project_id}) no longer exists on the primary. It is safe to remove this entry, as this will not remove any data on disk." +msgstr "" + +msgid "Geo|Projects in certain groups" +msgstr "" + +msgid "Geo|Projects in certain storage shards" +msgstr "" + +msgid "Geo|Re-verification interval" +msgstr "" + +msgid "Geo|Redownload" +msgstr "" + +msgid "Geo|Remove" +msgstr "" + +msgid "Geo|Repository sync capacity" +msgstr "" + +msgid "Geo|Resync" +msgstr "" + +msgid "Geo|Resync all projects" +msgstr "" + +msgid "Geo|Retry count" +msgstr "" + +msgid "Geo|Reverify" +msgstr "" + +msgid "Geo|Reverify all projects" +msgstr "" + +msgid "Geo|Select groups to replicate." +msgstr "" + +msgid "Geo|Selective synchronization" +msgstr "" + +msgid "Geo|Shards to synchronize" +msgstr "" + +msgid "Geo|Status" +msgstr "" + +msgid "Geo|Sync" +msgstr "" + +msgid "Geo|Synced" +msgstr "" + +msgid "Geo|Synced at" +msgstr "" + +msgid "Geo|Synchronization failed - %{error}" +msgstr "" + +msgid "Geo|The URL defined on the primary node that secondary nodes should use to contact it. Defaults to URL" +msgstr "" + +msgid "Geo|The database is currently %{db_lag} behind the primary node." +msgstr "" + +msgid "Geo|The node is currently %{minutes_behind} behind the primary node." +msgstr "" + +msgid "Geo|This is a primary node" +msgstr "" + +msgid "Geo|Tracking entry for project (%{project_id}) was successfully removed." +msgstr "" + +msgid "Geo|Tracking entry for upload (%{type}/%{id}) was successfully removed." +msgstr "" + +msgid "Geo|Tracking entry will be removed. Are you sure?" +msgstr "" + +msgid "Geo|URL" +msgstr "" + +msgid "Geo|Unknown state" +msgstr "" + +msgid "Geo|Verification capacity" +msgstr "" + +msgid "Geo|Verification failed - %{error}" +msgstr "" + +msgid "Geo|Waiting for scheduler" +msgstr "" + +msgid "Geo|You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}." +msgstr "" + +msgid "Geo|You are on a secondary, <b>read-only</b> Geo node. You may be able to make a limited amount of changes or perform a limited amount of actions on this page." +msgstr "" + +msgid "Geo|misconfigured" +msgstr "" + +msgid "Geo|primary" +msgstr "" + +msgid "Geo|secondary" +msgstr "" + +msgid "Get a free instance review" +msgstr "" + msgid "Get started with error tracking" msgstr "" @@ -5343,6 +7287,9 @@ msgstr "" msgid "Git LFS is not enabled on this GitLab server, contact your admin." msgstr "" +msgid "Git LFS objects will be synced in pull mirrors if LFS is %{docs_link_start}enabled for the project%{docs_link_end}. They will <strong>not</strong> be synced in push mirrors." +msgstr "" + msgid "Git global setup" msgstr "" @@ -5367,6 +7314,12 @@ msgstr "" msgid "GitLab CI Linter has been moved" msgstr "" +msgid "GitLab Enterprise Edition %{plan}" +msgstr "" + +msgid "GitLab Geo" +msgstr "" + msgid "GitLab Group Runners can execute code for all the projects in this group." msgstr "" @@ -5379,18 +7332,33 @@ msgstr "" msgid "GitLab User" msgstr "" +msgid "GitLab allows you to continue using your license even if you exceed the number of seats you purchased. You will be required to pay for these seats when you renew your license." +msgstr "" + +msgid "GitLab for Slack" +msgstr "" + msgid "GitLab is obtaining a Let's Encrypt SSL certificate for this domain. This process can take some time. Please try again later." msgstr "" msgid "GitLab member or Email address" msgstr "" +msgid "GitLab metadata URL" +msgstr "" + msgid "GitLab project export" msgstr "" msgid "GitLab restart is required to apply changes" msgstr "" +msgid "GitLab single sign on URL" +msgstr "" + +msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory." +msgstr "" + msgid "GitLab.com import" msgstr "" @@ -5409,6 +7377,9 @@ msgstr "" msgid "Gitea Import" msgstr "" +msgid "Gitlab CI/CD" +msgstr "" + msgid "Gitlab Pages" msgstr "" @@ -5538,6 +7509,9 @@ msgstr "" msgid "Go to your snippets" msgstr "" +msgid "Golden Tanuki" +msgstr "" + msgid "Google Code import" msgstr "" @@ -5592,6 +7566,9 @@ msgstr "" msgid "Group Runners" msgstr "" +msgid "Group SAML must be enabled to test" +msgstr "" + msgid "Group URL" msgstr "" @@ -5616,12 +7593,120 @@ msgstr "" msgid "Group name" msgstr "" +msgid "Group overview content" +msgstr "" + +msgid "Group pipeline minutes were successfully reset." +msgstr "" + msgid "Group was successfully updated." msgstr "" msgid "Group: %{group_name}" msgstr "" +msgid "Group: %{name}" +msgstr "" + +msgid "GroupRoadmap|%{startDateInWords} – %{endDateInWords}" +msgstr "" + +msgid "GroupRoadmap|From %{dateWord}" +msgstr "" + +msgid "GroupRoadmap|Something went wrong while fetching epics" +msgstr "" + +msgid "GroupRoadmap|Sorry, no epics matched your search" +msgstr "" + +msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline" +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of the %{linkStart}child epics%{linkEnd}." +msgstr "" + +msgid "GroupRoadmap|To view the roadmap, add a start or due date to one of your epics in this group or its subgroups; from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|To widen your search, change or remove filters; from %{startDate} to %{endDate}." +msgstr "" + +msgid "GroupRoadmap|Until %{dateWord}" +msgstr "" + +msgid "GroupSAML|Certificate fingerprint" +msgstr "" + +msgid "GroupSAML|Configuration" +msgstr "" + +msgid "GroupSAML|Enable SAML authentication for this group." +msgstr "" + +msgid "GroupSAML|Enforce SSO-only authentication for this group." +msgstr "" + +msgid "GroupSAML|Enforce SSO-only membership for this group." +msgstr "" + +msgid "GroupSAML|Enforce users to have dedicated group managed accounts for this group." +msgstr "" + +msgid "GroupSAML|Enforced SSO" +msgstr "" + +msgid "GroupSAML|Generate a SCIM token" +msgstr "" + +msgid "GroupSAML|Generate a SCIM token to set up your System for Cross-Domain Identity Management." +msgstr "" + +msgid "GroupSAML|Identity provider single sign on URL" +msgstr "" + +msgid "GroupSAML|Make sure you save this token — you won't be able to access it again." +msgstr "" + +msgid "GroupSAML|Manage your group’s membership while adding another level of security with SAML." +msgstr "" + +msgid "GroupSAML|Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"." +msgstr "" + +msgid "GroupSAML|SAML Single Sign On" +msgstr "" + +msgid "GroupSAML|SAML Single Sign On Settings" +msgstr "" + +msgid "GroupSAML|SCIM API endpoint URL" +msgstr "" + +msgid "GroupSAML|SCIM Token" +msgstr "" + +msgid "GroupSAML|SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"." +msgstr "" + +msgid "GroupSAML|The SCIM token is now hidden. To see the value of the token again, you need to " +msgstr "" + +msgid "GroupSAML|To be able to enable enforced SSO, you first need to enable SAML authentication." +msgstr "" + +msgid "GroupSAML|To be able to enable group managed accounts, you first need to enable enforced SSO." +msgstr "" + +msgid "GroupSAML|Toggle SAML authentication" +msgstr "" + +msgid "GroupSAML|With group managed accounts enabled, all the users without a group managed account will be excluded from the group." +msgstr "" + +msgid "GroupSAML|Your SCIM token" +msgstr "" + msgid "GroupSettings|Auto DevOps pipeline was updated for the group" msgstr "" @@ -5631,6 +7716,9 @@ msgstr "" msgid "GroupSettings|Badges" msgstr "" +msgid "GroupSettings|Custom project templates" +msgstr "" + msgid "GroupSettings|Customize your group badges." msgstr "" @@ -5643,12 +7731,18 @@ msgstr "" msgid "GroupSettings|Learn more about badges." msgstr "" +msgid "GroupSettings|Learn more about group-level project templates." +msgstr "" + msgid "GroupSettings|New runners registration token has been generated!" msgstr "" msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgstr "" +msgid "GroupSettings|Select a sub-group as the custom project template source for this group." +msgstr "" + msgid "GroupSettings|The Auto DevOps pipeline will run if no alternative CI configuration file is found." msgstr "" @@ -5754,6 +7848,9 @@ msgstr "" msgid "HTTP Basic: Access denied\\nYou must use a personal access token with 'api' scope for Git over HTTP.\\nYou can generate one at %{profile_personal_access_tokens_url}" msgstr "" +msgid "Have your users email" +msgstr "" + msgid "Header logo was successfully removed." msgstr "" @@ -5778,6 +7875,12 @@ msgstr "" msgid "HealthCheck|Unhealthy" msgstr "" +msgid "Hello World!" +msgstr "" + +msgid "Hello there" +msgstr "" + msgid "Help" msgstr "" @@ -5837,12 +7940,18 @@ msgstr "" msgid "History of authentications" msgstr "" +msgid "Hook execution failed. Ensure the group has a project with commits." +msgstr "" + msgid "Hook was successfully created." msgstr "" msgid "Hook was successfully updated." msgstr "" +msgid "Hours" +msgstr "" + msgid "Housekeeping" msgstr "" @@ -5852,6 +7961,15 @@ msgstr "" msgid "Housekeeping, export, path, transfer, remove, archive." msgstr "" +msgid "How it works" +msgstr "" + +msgid "How many replicas each Elasticsearch shard has." +msgstr "" + +msgid "How many shards to split the Elasticsearch index over." +msgstr "" + msgid "However, you are already a member of this %{member_source}. Sign in using a different account to accept the invitation." msgstr "" @@ -5915,6 +8033,12 @@ msgstr "" msgid "IP Address" msgstr "" +msgid "IP address restriction is not editable in subgroups. Value inherited from top-level parent group." +msgstr "" + +msgid "IP subnet restriction only allowed for top-level groups" +msgstr "" + msgid "Identifier" msgstr "" @@ -5924,6 +8048,15 @@ msgstr "" msgid "If any job surpasses this timeout threshold, it will be marked as failed. Human readable time input language is accepted like \"1 hour\". Values without specification represent seconds." msgstr "" +msgid "If checked, group owners can manage LDAP group links and LDAP member overrides" +msgstr "" + +msgid "If checked, new group memberships and permissions can only be added via LDAP synchronization" +msgstr "" + +msgid "If disabled, a diverged local branch will not be automatically updated with commits from its remote counterpart, to prevent local data loss. If the default branch (%{default_branch}) has diverged and cannot be updated, mirroring will fail. Other diverged branches are silently ignored." +msgstr "" + msgid "If disabled, only admins will be able to set up mirrors in projects." msgstr "" @@ -5942,6 +8075,9 @@ msgstr "" msgid "If this was a mistake you can leave the %{source_type}." msgstr "" +msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}" +msgstr "" + msgid "If you lose your recovery codes you can generate new ones, invalidating all previous codes." msgstr "" @@ -6044,6 +8180,9 @@ msgstr "" msgid "Import/Export illustration" msgstr "" +msgid "ImportButtons|Connect repositories from" +msgstr "" + msgid "ImportProjects|Blocked import URL: %{message}" msgstr "" @@ -6068,6 +8207,21 @@ msgstr "" msgid "ImportProjects|Updating the imported projects failed" msgstr "" +msgid "Improve Issue boards" +msgstr "" + +msgid "Improve Issue boards with GitLab Enterprise Edition." +msgstr "" + +msgid "Improve Merge Requests and customer support 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 "In order to enable instance-level analytics, please ask an admin to enable %{usage_ping_link_start}usage ping%{usage_ping_link_end}." msgstr "" @@ -6077,6 +8231,9 @@ msgstr "" msgid "In the next step, you'll be able to select the projects you want to import." msgstr "" +msgid "Incidents" +msgstr "" + msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept." msgstr "" @@ -6089,6 +8246,9 @@ msgstr "" msgid "Include the username in the URL if required: <code>https://username@gitlab.company.com/group/project.git</code>." msgstr "" +msgid "Includes LFS objects. It can be overridden per group, or per project. 0 for unlimited." +msgstr "" + msgid "Includes an MVC structure to help you get started." msgstr "" @@ -6098,12 +8258,18 @@ msgstr "" msgid "Includes an MVC structure, mvnw and pom.xml to help you get started." msgstr "" +msgid "Incoming email" +msgstr "" + msgid "Incompatible Project" msgstr "" msgid "Incompatible options set!" msgstr "" +msgid "Index all projects" +msgstr "" + msgid "Indicates whether this runner can pick jobs without tags" msgstr "" @@ -6131,6 +8297,9 @@ msgstr "" msgid "Insert suggestion" msgstr "" +msgid "Insights" +msgstr "" + msgid "Install" msgstr "" @@ -6152,6 +8321,11 @@ msgstr "" msgid "Installing" msgstr "" +msgid "Instance" +msgid_plural "Instances" +msgstr[0] "" +msgstr[1] "" + msgid "Instance Statistics" msgstr "" @@ -6164,6 +8338,9 @@ msgstr "" msgid "Instance does not support multiple Kubernetes clusters" msgstr "" +msgid "Instance license" +msgstr "" + msgid "Integrations" msgstr "" @@ -6194,6 +8371,9 @@ msgstr "" msgid "Introducing Your Conversational Development Index" msgstr "" +msgid "Invalid Insights config file detected" +msgstr "" + msgid "Invalid Login or password" msgstr "" @@ -6221,9 +8401,15 @@ msgstr "" msgid "Invalid pin code" msgstr "" +msgid "Invalid query" +msgstr "" + msgid "Invalid repository path" msgstr "" +msgid "Invalid server response" +msgstr "" + msgid "Invalid two-factor code." msgstr "" @@ -6245,7 +8431,16 @@ msgstr "" msgid "Invocations" msgstr "" -msgid "IssuableStatus|Closed (%{moved_link_start}moved%{moved_link_end})" +msgid "Is using license seat:" +msgstr "" + +msgid "IssuableStatus|Closed" +msgstr "" + +msgid "IssuableStatus|Closed (%{link})" +msgstr "" + +msgid "IssuableStatus|duplicated" msgstr "" msgid "IssuableStatus|moved" @@ -6257,9 +8452,15 @@ msgstr "" msgid "Issue Boards" msgstr "" +msgid "Issue board focus mode" +msgstr "" + msgid "Issue events" msgstr "" +msgid "Issue template (optional)" +msgstr "" + msgid "Issue update failed" msgstr "" @@ -6311,12 +8512,42 @@ msgstr "" msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable." msgstr "" +msgid "Issues closed" +msgstr "" + msgid "Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities" msgstr "" msgid "Issues, merge requests, pushes, and comments." msgstr "" +msgid "IssuesAnalytics|After you begin creating issues for your projects, we can start tracking and displaying metrics for them" +msgstr "" + +msgid "IssuesAnalytics|Avg/Month:" +msgstr "" + +msgid "IssuesAnalytics|Issues created" +msgstr "" + +msgid "IssuesAnalytics|Issues created per month" +msgstr "" + +msgid "IssuesAnalytics|Last 12 months" +msgstr "" + +msgid "IssuesAnalytics|Sorry, your filter produced no results" +msgstr "" + +msgid "IssuesAnalytics|There are no issues for the projects in your group" +msgstr "" + +msgid "IssuesAnalytics|To widen your search, change or remove filters in the filter bar above" +msgstr "" + +msgid "IssuesAnalytics|Total:" +msgstr "" + msgid "It may take up to 30 minutes before the site is available after the first deployment." msgstr "" @@ -6326,6 +8557,12 @@ msgstr "" msgid "It's you" msgstr "" +msgid "Jaeger URL" +msgstr "" + +msgid "Jaeger tracing" +msgstr "" + msgid "Jan" msgstr "" @@ -6518,12 +8755,21 @@ msgstr "" msgid "Kubernetes configured" msgstr "" +msgid "Kubernetes deployment not found" +msgstr "" + msgid "Kubernetes error: %{error_code}" msgstr "" msgid "LDAP" msgstr "" +msgid "LDAP settings" +msgstr "" + +msgid "LDAP sync in progress. This could take a few minutes. Refresh the page to see the changes." +msgstr "" + msgid "LFS" msgstr "" @@ -6545,6 +8791,9 @@ msgstr "" msgid "Label actions dropdown" msgstr "" +msgid "Label lists show all issues with the selected label." +msgstr "" + msgid "Label was created" msgstr "" @@ -6598,6 +8847,9 @@ msgid_plural "Last %d days" msgstr[0] "" msgstr[1] "" +msgid "Last %{days} days" +msgstr "" + msgid "Last Pipeline" msgstr "" @@ -6658,9 +8910,15 @@ msgstr "" msgid "Lead" msgstr "" +msgid "Learn GitLab" +msgstr "" + msgid "Learn how to %{link_start}contribute to the built-in templates%{link_end}" msgstr "" +msgid "Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab." +msgstr "" + msgid "Learn more" msgstr "" @@ -6670,12 +8928,33 @@ msgstr "" msgid "Learn more about Kubernetes" msgstr "" +msgid "Learn more about Web Terminal" +msgstr "" + msgid "Learn more about adding certificates to your project by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}." msgstr "" +msgid "Learn more about approvals." +msgstr "" + +msgid "Learn more about custom project templates" +msgstr "" + +msgid "Learn more about deploying to a cluster" +msgstr "" + +msgid "Learn more about group-level project templates" +msgstr "" + msgid "Learn more about signing commits" msgstr "" +msgid "Learn more about the dependency list" +msgstr "" + +msgid "Learn more about vulnerability check" +msgstr "" + msgid "Learn more in the" msgstr "" @@ -6703,9 +8982,118 @@ msgstr "" msgid "Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}." msgstr "" +msgid "License" +msgstr "" + +msgid "License Compliance" +msgstr "" + +msgid "LicenseCompliance|Add a license" +msgstr "" + +msgid "LicenseCompliance|Add licenses manually to approve or blacklist" +msgstr "" + +msgid "LicenseCompliance|Approve" +msgstr "" + +msgid "LicenseCompliance|Approve license" +msgstr "" + +msgid "LicenseCompliance|Approve license?" +msgstr "" + +msgid "LicenseCompliance|Approved" +msgstr "" + +msgid "LicenseCompliance|Blacklist" +msgstr "" + +msgid "LicenseCompliance|Blacklist license" +msgstr "" + +msgid "LicenseCompliance|Blacklist license?" +msgstr "" + +msgid "LicenseCompliance|Blacklisted" +msgstr "" + +msgid "LicenseCompliance|Cancel" +msgstr "" + +msgid "LicenseCompliance|Here you can approve or blacklist licenses for this project. Using %{ci} or %{license} will allow you to see if there are any unmanaged licenses and approve or blacklist them in merge request." +msgstr "" + +msgid "LicenseCompliance|License" +msgstr "" + +msgid "LicenseCompliance|License Compliance" +msgstr "" + +msgid "LicenseCompliance|License Compliance detected %d license for the source branch only" +msgid_plural "LicenseCompliance|License Compliance detected %d licenses for the source branch only" +msgstr[0] "" +msgstr[1] "" + +msgid "LicenseCompliance|License Compliance detected %d new license" +msgid_plural "LicenseCompliance|License Compliance detected %d new licenses" +msgstr[0] "" +msgstr[1] "" + +msgid "LicenseCompliance|License Compliance detected no licenses for the source branch only" +msgstr "" + +msgid "LicenseCompliance|License Compliance detected no new licenses" +msgstr "" + +msgid "LicenseCompliance|License details" +msgstr "" + +msgid "LicenseCompliance|License name" +msgstr "" + +msgid "LicenseCompliance|Packages" +msgstr "" + +msgid "LicenseCompliance|Remove license" +msgstr "" + +msgid "LicenseCompliance|Remove license?" +msgstr "" + +msgid "LicenseCompliance|Submit" +msgstr "" + +msgid "LicenseCompliance|There are currently no approved or blacklisted licenses in this project." +msgstr "" + +msgid "LicenseCompliance|There are currently no approved or blacklisted licenses that match in this project." +msgstr "" + +msgid "LicenseCompliance|This license already exists in this project." +msgstr "" + +msgid "LicenseCompliance|URL" +msgstr "" + +msgid "LicenseCompliance|You are about to remove the license, %{name}, from this project." +msgstr "" + +msgid "Licensed Features" +msgstr "" + +msgid "Licensed to" +msgstr "" + +msgid "Licenses" +msgstr "" + msgid "Limit display of time tracking units to hours." msgstr "" +msgid "Limit namespaces and projects that can be indexed" +msgstr "" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "" @@ -6720,6 +9108,9 @@ msgstr "" msgid "LinkedIn" msgstr "" +msgid "LinkedPipelines|%{counterLabel} more downstream pipelines" +msgstr "" + msgid "List" msgstr "" @@ -6729,6 +9120,12 @@ msgstr "" msgid "List available repositories" msgstr "" +msgid "List of IPs and CIDRs of allowed secondary nodes. Comma-separated, e.g. \"1.1.1.1, 2.2.2.0/24\"" +msgstr "" + +msgid "List the merge requests that must be merged before this one." +msgstr "" + msgid "List view" msgstr "" @@ -6738,6 +9135,9 @@ msgstr "" msgid "Live preview" msgstr "" +msgid "Loading contribution stats for group members" +msgstr "" + msgid "Loading functions timed out. Please reload the page to try again." msgstr "" @@ -6762,6 +9162,9 @@ msgstr "" msgid "Lock %{issuableDisplayName}" msgstr "" +msgid "Lock memberships to LDAP synchronization" +msgstr "" + msgid "Lock not found" msgstr "" @@ -6777,6 +9180,9 @@ msgstr "" msgid "Locked" msgstr "" +msgid "Locked Files" +msgstr "" + msgid "Locked by %{fileLockUserName}" msgstr "" @@ -6786,9 +9192,15 @@ msgstr "" msgid "Locked to current projects" msgstr "" +msgid "Locks give the ability to lock specific file or folder." +msgstr "" + msgid "Locks the discussion." msgstr "" +msgid "Login with smartcard" +msgstr "" + msgid "Logo was successfully removed." msgstr "" @@ -6798,6 +9210,15 @@ msgstr "" msgid "MERGED" msgstr "" +msgid "MRApprovals|Approved by" +msgstr "" + +msgid "MRApprovals|Approvers" +msgstr "" + +msgid "MRApprovals|Pending approvals" +msgstr "" + msgid "MRDiff|Show changes only" msgstr "" @@ -6810,6 +9231,9 @@ msgstr "" msgid "Make and review changes in the browser with the Web IDE" 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 "Make issue confidential" msgstr "" @@ -6900,6 +9324,9 @@ msgstr "" msgid "Mark this issue as a duplicate of another issue" msgstr "" +msgid "Mark this issue as related to another issue" +msgstr "" + msgid "Markdown" msgstr "" @@ -6921,6 +9348,9 @@ msgstr "" msgid "Marked this issue as a duplicate of %{duplicate_param}." msgstr "" +msgid "Marked this issue as related to %{issue_ref}." +msgstr "" + msgid "Marks To Do as done." msgstr "" @@ -6930,6 +9360,12 @@ msgstr "" msgid "Marks this issue as a duplicate of %{duplicate_reference}." msgstr "" +msgid "Marks this issue as related to %{issue_ref}." +msgstr "" + +msgid "Match not found; try refining your search query." +msgstr "" + msgid "MattermostService|Add to Mattermost" msgstr "" @@ -6960,30 +9396,51 @@ msgstr "" msgid "MattermostService|This service allows users to perform common operations on this project by entering slash commands in Mattermost." msgstr "" +msgid "Maven Metadata" +msgstr "" + msgid "Max access level" msgstr "" +msgid "Max seats used" +msgstr "" + msgid "Maximum artifacts size (MB)" msgstr "" msgid "Maximum attachment size (MB)" msgstr "" +msgid "Maximum capacity" +msgstr "" + +msgid "Maximum delay (Minutes)" +msgstr "" + msgid "Maximum job timeout" msgstr "" msgid "Maximum job timeout has a value which could not be accepted" msgstr "" +msgid "Maximum number of mirrors that can be synchronizing at the same time." +msgstr "" + msgid "Maximum push size (MB)" msgstr "" +msgid "Maximum time between updates that a mirror can have when scheduled to synchronize." +msgstr "" + msgid "May" msgstr "" msgid "Median" msgstr "" +msgid "Member lock" +msgstr "" + msgid "Member since %{date}" msgstr "" @@ -7011,9 +9468,15 @@ msgstr "" msgid "Merge Request" msgstr "" +msgid "Merge Request Approvals" +msgstr "" + msgid "Merge Requests" msgstr "" +msgid "Merge Requests created" +msgstr "" + msgid "Merge commit message" msgstr "" @@ -7029,12 +9492,21 @@ msgstr "" msgid "Merge request" msgstr "" +msgid "Merge request approvals" +msgstr "" + +msgid "Merge request approvals allow you to set the number of necessary approvals and predefine a list of approvers that will need to approve every merge request in a project." +msgstr "" + msgid "Merge requests" msgstr "" msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others" msgstr "" +msgid "Merge requests are read-only in a secondary Geo node" +msgstr "" + msgid "Merge when pipeline succeeds" msgstr "" @@ -7065,6 +9537,9 @@ msgstr "" msgid "MergeRequests|Add a reply" msgstr "" +msgid "MergeRequests|An error occurred while saving the draft comment." +msgstr "" + msgid "MergeRequests|Failed to squash. Should be done manually." msgstr "" @@ -7083,6 +9558,18 @@ msgstr "" msgid "MergeRequests|Squash task canceled: another squash is already in progress." msgstr "" +msgid "MergeRequests|Thread stays resolved" +msgstr "" + +msgid "MergeRequests|Thread stays unresolved" +msgstr "" + +msgid "MergeRequests|Thread will be resolved" +msgstr "" + +msgid "MergeRequests|Thread will be unresolved" +msgstr "" + msgid "MergeRequests|Toggle comments for this file" msgstr "" @@ -7140,6 +9627,12 @@ msgstr "" msgid "Method" msgstr "" +msgid "Metric was successfully added." +msgstr "" + +msgid "Metric was successfully updated." +msgstr "" + msgid "Metrics" msgstr "" @@ -7167,15 +9660,48 @@ msgstr "" msgid "Metrics|Check out the CI/CD documentation on deploying to an environment" msgstr "" +msgid "Metrics|Create metric" +msgstr "" + +msgid "Metrics|Delete metric" +msgstr "" + +msgid "Metrics|Delete metric?" +msgstr "" + +msgid "Metrics|Edit metric" +msgstr "" + msgid "Metrics|Environment" msgstr "" +msgid "Metrics|For grouping similar metrics" +msgstr "" + +msgid "Metrics|Label of the y-axis (usually the unit). The x-axis always represents time." +msgstr "" + msgid "Metrics|Learn about environments" msgstr "" +msgid "Metrics|Legend label (optional)" +msgstr "" + +msgid "Metrics|Must be a valid PromQL query." +msgstr "" + +msgid "Metrics|New metric" +msgstr "" + msgid "Metrics|No deployed environments" msgstr "" +msgid "Metrics|PromQL query is valid" +msgstr "" + +msgid "Metrics|Prometheus Query Documentation" +msgstr "" + msgid "Metrics|Show last" msgstr "" @@ -7188,6 +9714,9 @@ msgstr "" msgid "Metrics|There was an error getting environments information." msgstr "" +msgid "Metrics|There was an error trying to validate your query" +msgstr "" + msgid "Metrics|There was an error while retrieving metrics" msgstr "" @@ -7197,6 +9726,36 @@ msgstr "" msgid "Metrics|Unexpected metrics data response from prometheus endpoint" msgstr "" +msgid "Metrics|Unit label" +msgstr "" + +msgid "Metrics|Used as a title for the chart" +msgstr "" + +msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response." +msgstr "" + +msgid "Metrics|Y-axis label" +msgstr "" + +msgid "Metrics|You're about to permanently delete this metric. This cannot be undone." +msgstr "" + +msgid "Metrics|e.g. HTTP requests" +msgstr "" + +msgid "Metrics|e.g. Requests/second" +msgstr "" + +msgid "Metrics|e.g. Throughput" +msgstr "" + +msgid "Metrics|e.g. rate(http_requests_total[5m])" +msgstr "" + +msgid "Metrics|e.g. req/sec" +msgstr "" + msgid "Migrated %{success_count}/%{total_count} files." msgstr "" @@ -7206,6 +9765,12 @@ msgstr "" msgid "Milestone" msgstr "" +msgid "Milestone lists not available with your current license" +msgstr "" + +msgid "Milestone lists show all issues from the selected milestone." +msgstr "" + msgid "Milestones" msgstr "" @@ -7239,18 +9804,27 @@ msgstr "" msgid "Milestones|This action cannot be reversed." msgstr "" +msgid "Minimum capacity to be available before we schedule more mirrors preemptively." +msgstr "" + msgid "Minimum length is %{minimum_password_length} characters" msgstr "" msgid "Minimum length is %{minimum_password_length} characters." msgstr "" +msgid "Minutes" +msgstr "" + msgid "Mirror direction" msgstr "" msgid "Mirror repository" msgstr "" +msgid "Mirror user" +msgstr "" + msgid "Mirrored repositories" msgstr "" @@ -7260,6 +9834,15 @@ msgstr "" msgid "Mirroring settings were successfully updated." msgstr "" +msgid "Mirroring settings were successfully updated. The project is being updated." +msgstr "" + +msgid "Mirroring was successfully disabled." +msgstr "" + +msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user." +msgstr "" + msgid "Missing commit signatures endpoint!" msgstr "" @@ -7290,12 +9873,24 @@ msgstr "" msgid "Monitoring" msgstr "" +msgid "Months" +msgstr "" + msgid "More" msgstr "" +msgid "More Information" +msgstr "" + +msgid "More Slack commands" +msgstr "" + msgid "More actions" msgstr "" +msgid "More info" +msgstr "" + msgid "More information" msgstr "" @@ -7347,6 +9942,9 @@ msgstr "" msgid "Moves this issue to %{path_to_project}." msgstr "" +msgid "Multiple issue boards" +msgstr "" + msgid "Multiple model types found: %{model_types}" msgstr "" @@ -7368,6 +9966,9 @@ msgstr "" msgid "Name:" msgstr "" +msgid "Namespaces to index" +msgstr "" + msgid "Naming, topics, avatar" msgstr "" @@ -7386,6 +9987,9 @@ msgstr "" msgid "Nav|Sign out and sign in with a different account" msgstr "" +msgid "Need help?" +msgstr "" + msgid "Network" msgstr "" @@ -7448,6 +10052,12 @@ msgstr "" msgid "New environment" msgstr "" +msgid "New epic" +msgstr "" + +msgid "New epic title" +msgstr "" + msgid "New file" msgstr "" @@ -7490,6 +10100,9 @@ msgstr "" msgid "New snippet" msgstr "" +msgid "New stage" +msgstr "" + msgid "New subgroup" msgstr "" @@ -7529,6 +10142,9 @@ msgstr "" msgid "No %{providerTitle} repositories available to import" msgstr "" +msgid "No Epic" +msgstr "" + msgid "No Label" msgstr "" @@ -7568,15 +10184,24 @@ msgstr "" msgid "No contributions were found" msgstr "" +msgid "No credit card required." +msgstr "" + msgid "No data found" msgstr "" msgid "No data to display" msgstr "" +msgid "No deployments found" +msgstr "" + msgid "No details available" msgstr "" +msgid "No due date" +msgstr "" + msgid "No errors to display." msgstr "" @@ -7598,6 +10223,9 @@ msgstr "" msgid "No forks available to you." msgstr "" +msgid "No issues for the selected time period." +msgstr "" + msgid "No job trace" msgstr "" @@ -7607,6 +10235,15 @@ msgstr "" msgid "No license. All rights reserved" msgstr "" +msgid "No licenses found." +msgstr "" + +msgid "No matching results" +msgstr "" + +msgid "No merge requests for the selected time period." +msgstr "" + msgid "No merge requests found" msgstr "" @@ -7631,9 +10268,15 @@ msgstr "" msgid "No public groups" msgstr "" +msgid "No pushes for the selected time period." +msgstr "" + msgid "No repository" msgstr "" +msgid "No required pipeline" +msgstr "" + msgid "No runners found" msgstr "" @@ -7643,15 +10286,33 @@ msgstr "" msgid "No starrers matched your search" msgstr "" +msgid "No start date" +msgstr "" + msgid "No template" msgstr "" +msgid "No value set by top-level parent group." +msgstr "" + msgid "No, directly import the existing email addresses and usernames." msgstr "" +msgid "No, not interested right now" +msgstr "" + msgid "Nobody has starred this repository yet" msgstr "" +msgid "Node was successfully created." +msgstr "" + +msgid "Node was successfully updated." +msgstr "" + +msgid "Nodes" +msgstr "" + msgid "None" msgstr "" @@ -7673,6 +10334,9 @@ msgstr "" msgid "Not found." msgstr "" +msgid "Not helpful" +msgstr "" + msgid "Not now" msgstr "" @@ -7688,9 +10352,15 @@ msgstr "" msgid "Note that this invitation was sent to %{mail_to_invite_email}, but you are signed in as %{link_to_current_user} with email %{mail_to_current_user}." msgstr "" +msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token." +msgstr "" + msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token." msgstr "" +msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token." +msgstr "" + msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token." msgstr "" @@ -7745,6 +10415,9 @@ msgstr "" msgid "NotificationEvent|Merge merge request" msgstr "" +msgid "NotificationEvent|New epic" +msgstr "" + msgid "NotificationEvent|New issue" msgstr "" @@ -7805,6 +10478,27 @@ msgstr "" msgid "November" msgstr "" +msgid "Number of Elasticsearch replicas" +msgstr "" + +msgid "Number of Elasticsearch shards" +msgstr "" + +msgid "Number of LOCs per commit" +msgstr "" + +msgid "Number of commits per MR" +msgstr "" + +msgid "Number of files touched" +msgstr "" + +msgid "OK" +msgstr "" + +msgid "Object Storage replication" +msgstr "" + msgid "Object does not exist on the server or you don't have permissions to access it" msgstr "" @@ -7817,9 +10511,18 @@ msgstr "" msgid "OfSearchInADropdown|Filter" msgstr "" +msgid "Ok let's go" +msgstr "" + msgid "OmniAuth" msgstr "" +msgid "Onboarding" +msgstr "" + +msgid "Once imported, repositories can be mirrored over SSH. Read more %{link_start}here%{link_end}." +msgstr "" + msgid "Once removed, the fork relationship cannot be restored and you will no longer be able to send merge requests to the source." msgstr "" @@ -7831,30 +10534,51 @@ msgid_plural "%d more items" msgstr[0] "" msgstr[1] "" +msgid "One or more groups that you don't have access to." +msgstr "" + msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git." msgstr "" msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git." msgstr "" +msgid "One or more of your dependency files are not supported, and the dependency list may be incomplete. Below is a list of supported file types." +msgstr "" + msgid "Only Project Members" msgstr "" msgid "Only admins" msgstr "" +msgid "Only admins can delete project" +msgstr "" + msgid "Only mirror protected branches" msgstr "" msgid "Only policy:" msgstr "" +msgid "Only proceed if you trust %{idp_url} to control your GitLab account sign in." +msgstr "" + msgid "Only project members can comment." msgstr "" msgid "Only project members will be imported. Group members will be skipped." msgstr "" +msgid "Only these extensions are supported: %{extension_list}" +msgstr "" + +msgid "Only users with an email address in this domain can be added to the group.<br>Example: <code>gitlab.com</code>. Some common domains are not allowed. %{read_more_link}." +msgstr "" + +msgid "Only ‘Reporter’ roles and above on tiers Premium / Silver and above can see Productivity Analytics." +msgstr "" + msgid "Oops, are you sure?" msgstr "" @@ -7882,6 +10606,9 @@ msgstr "" msgid "Open issues" msgstr "" +msgid "Open projects" +msgstr "" + msgid "Open raw" msgstr "" @@ -7894,6 +10621,12 @@ msgstr "" msgid "Opened" msgstr "" +msgid "Opened MR" +msgstr "" + +msgid "Opened issues" +msgstr "" + msgid "OpenedNDaysAgo|Opened" msgstr "" @@ -7915,6 +10648,24 @@ msgstr "" msgid "Operations Settings" msgstr "" +msgid "OperationsDashboard|Add a project to the dashboard" +msgstr "" + +msgid "OperationsDashboard|Add projects" +msgstr "" + +msgid "OperationsDashboard|More information" +msgstr "" + +msgid "OperationsDashboard|Operations Dashboard" +msgstr "" + +msgid "OperationsDashboard|The operations dashboard provides a summary of each project's operational health, including pipeline and alert statuses." +msgstr "" + +msgid "Optional" +msgstr "" + msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab." msgstr "" @@ -7930,6 +10681,12 @@ msgstr "" msgid "Other Labels" msgstr "" +msgid "Other information" +msgstr "" + +msgid "Other merge requests block this MR" +msgstr "" + msgid "Other visibility settings have been disabled by the administrator." msgstr "" @@ -7939,6 +10696,9 @@ msgstr "" msgid "Overview" msgstr "" +msgid "Overwrite diverged branches" +msgstr "" + msgid "Owned by anyone" msgstr "" @@ -7948,6 +10708,24 @@ msgstr "" msgid "Owner" msgstr "" +msgid "Package information" +msgstr "" + +msgid "Package was removed" +msgstr "" + +msgid "PackageRegistry|Delete Package Version" +msgstr "" + +msgid "PackageRegistry|There was a problem fetching the details for this package." +msgstr "" + +msgid "PackageRegistry|Unable to load package" +msgstr "" + +msgid "PackageRegistry|You are about to delete version %{boldStart}%{version}%{boldEnd} of %{boldStart}%{name}%{boldEnd}. Are you sure?" +msgstr "" + msgid "Packages" msgstr "" @@ -8023,6 +10801,12 @@ msgstr "" msgid "Paste a machine public key here. Read more about how to generate it %{link_start}here%{link_end}" msgstr "" +msgid "Paste epic link" +msgstr "" + +msgid "Paste issue link" +msgstr "" + msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_ed25519.pub' or '~/.ssh/id_rsa.pub' and begins with 'ssh-ed25519' or 'ssh-rsa'. Don't use your private SSH key." msgstr "" @@ -8038,6 +10822,9 @@ msgstr "" msgid "Pause" msgstr "" +msgid "Pause replication" +msgstr "" + msgid "Paused Runners don't accept new jobs" msgstr "" @@ -8122,6 +10909,12 @@ msgstr "" msgid "Pipeline Schedules" msgstr "" +msgid "Pipeline minutes quota" +msgstr "" + +msgid "Pipeline quota" +msgstr "" + msgid "Pipeline triggers" msgstr "" @@ -8206,6 +10999,15 @@ msgstr "" msgid "Pipelines settings for '%{project_name}' were successfully updated." msgstr "" +msgid "Pipelines| to purchase more minutes." +msgstr "" + +msgid "Pipelines|%{namespace_name} has exceeded its pipeline minutes quota." +msgstr "" + +msgid "Pipelines|%{namespace_name} has less than %{notification_level}%% of CI minutes available." +msgstr "" + msgid "Pipelines|API" msgstr "" @@ -8227,6 +11029,9 @@ msgstr "" msgid "Pipelines|Loading Pipelines" msgstr "" +msgid "Pipelines|Pipelines will not run anymore on shared Runners." +msgstr "" + msgid "Pipelines|Project cache successfully reset." msgstr "" @@ -8362,9 +11167,21 @@ msgstr "" msgid "Please accept the Terms of Service before continuing." msgstr "" +msgid "Please add a comment in the text area above" +msgstr "" + msgid "Please add a list to your board first" msgstr "" +msgid "Please check the configuration file for this chart" +msgstr "" + +msgid "Please check the configuration file to ensure that a collection of charts has been declared." +msgstr "" + +msgid "Please check the configuration file to ensure that it is available and the YAML is valid" +msgstr "" + msgid "Please check your email (%{email}) to verify that you own this address. Didn't receive it? %{resend_link}. Wrong email address? %{update_link}." msgstr "" @@ -8386,12 +11203,33 @@ msgstr "" msgid "Please create a username with only alphanumeric characters." msgstr "" +msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}" +msgstr "" + +msgid "Please enter a non-negative number" +msgstr "" + +msgid "Please enter a number greater than %{number} (from the project settings)" +msgstr "" + +msgid "Please enter a valid number" +msgstr "" + +msgid "Please enter or upload a license." +msgstr "" + msgid "Please fill in a descriptive name for your group." msgstr "" +msgid "Please migrate all existing projects to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}" +msgstr "" + msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access." msgstr "" +msgid "Please provide a name" +msgstr "" + msgid "Please provide a valid email address." msgstr "" @@ -8404,6 +11242,9 @@ msgstr "" msgid "Please select a group." msgstr "" +msgid "Please select and add a member" +msgstr "" + msgid "Please select at least one filter to see results" msgstr "" @@ -8416,15 +11257,24 @@ msgstr "" msgid "Please try again" msgstr "" +msgid "Please upgrade PostgreSQL to version 9.6 or greater. The status of the replication cannot be determined reliably with the current version." +msgstr "" + msgid "Please use this form to report to the admin users who create spam issues, comments or behave inappropriately." msgstr "" msgid "Please wait a moment, this page will automatically refresh when ready." msgstr "" +msgid "Please wait while we connect to your repository. Refresh at will." +msgstr "" + msgid "Please wait while we import the repository for you. Refresh at will." msgstr "" +msgid "Pods in use" +msgstr "" + msgid "Preferences" msgstr "" @@ -8494,6 +11344,15 @@ msgstr "" msgid "Press Enter or click to search" msgstr "" +msgid "Prevent adding new members to project membership within this group" +msgstr "" + +msgid "Prevent approval of merge requests by merge request author" +msgstr "" + +msgid "Prevent approval of merge requests by merge request committers" +msgstr "" + msgid "Preview" msgstr "" @@ -8515,6 +11374,9 @@ msgstr "" msgid "Previous unresolved discussion (MRs only)" msgstr "" +msgid "Primary" +msgstr "" + msgid "Prioritize" msgstr "" @@ -8536,6 +11398,9 @@ msgstr "" msgid "Private - The group and its projects can only be viewed by members." msgstr "" +msgid "Private group(s)" +msgstr "" + msgid "Private profile" msgstr "" @@ -8545,6 +11410,18 @@ msgstr "" msgid "Proceed" msgstr "" +msgid "Productivity Analytics" +msgstr "" + +msgid "Productivity analytics can help identify the problems that are delaying your team" +msgstr "" + +msgid "ProductivityAnalytics|Ascending" +msgstr "" + +msgid "ProductivityAnalytics|Descending" +msgstr "" + msgid "Profile" msgstr "" @@ -8962,6 +11839,9 @@ msgstr "" msgid "Project visibility level will be changed to match namespace rules when transferring to a group." msgstr "" +msgid "Project: %{name}" +msgstr "" + msgid "ProjectActivityRSS|Subscribe" msgstr "" @@ -9073,12 +11953,24 @@ msgstr "" msgid "ProjectSettings|Choose your merge method, merge options, and merge checks." msgstr "" +msgid "ProjectSettings|Choose your merge method, merge options, merge checks, and set up a default description template for merge requests." +msgstr "" + +msgid "ProjectSettings|Contact an admin to change this setting." +msgstr "" + msgid "ProjectSettings|Customize your project badges." msgstr "" msgid "ProjectSettings|Every merge creates a merge commit" msgstr "" +msgid "ProjectSettings|Failed to protect the tag" +msgstr "" + +msgid "ProjectSettings|Failed to update tag!" +msgstr "" + msgid "ProjectSettings|Fast-forward merge" msgstr "" @@ -9103,9 +11995,15 @@ msgstr "" msgid "ProjectSettings|Merge options" msgstr "" +msgid "ProjectSettings|Merge pipelines will try to validate the post-merge result prior to merging" +msgstr "" + msgid "ProjectSettings|No merge commits are created" msgstr "" +msgid "ProjectSettings|Only signed commits can be pushed to this repository." +msgstr "" + msgid "ProjectSettings|Pipelines must succeed" msgstr "" @@ -9118,9 +12016,21 @@ msgstr "" msgid "ProjectSettings|These checks must pass before merge requests can be merged" 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|This will dictate the commit history when you merge a merge request" msgstr "" +msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." +msgstr "" + msgid "ProjectSettings|When conflicts arise the user is given the option to rebase" msgstr "" @@ -9190,6 +12100,9 @@ msgstr "" msgid "Projects that belong to a group are prefixed with the group namespace. Existing projects may be moved into a group." msgstr "" +msgid "Projects to index" +msgstr "" + msgid "Projects with write access" msgstr "" @@ -9265,6 +12178,33 @@ msgstr "" msgid "Prometheus listen_address in config/gitlab.yml is not a valid URI" msgstr "" +msgid "PrometheusAlerts|Add alert" +msgstr "" + +msgid "PrometheusAlerts|Edit alert" +msgstr "" + +msgid "PrometheusAlerts|Error creating alert" +msgstr "" + +msgid "PrometheusAlerts|Error deleting alert" +msgstr "" + +msgid "PrometheusAlerts|Error fetching alert" +msgstr "" + +msgid "PrometheusAlerts|Error saving alert" +msgstr "" + +msgid "PrometheusAlerts|Operator" +msgstr "" + +msgid "PrometheusAlerts|Select query" +msgstr "" + +msgid "PrometheusAlerts|Threshold" +msgstr "" + msgid "PrometheusService|%{exporters} with %{metrics} were found" msgstr "" @@ -9286,9 +12226,21 @@ msgstr "" msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters." msgstr "" +msgid "PrometheusService|Custom metrics" +msgstr "" + +msgid "PrometheusService|Custom metrics require Prometheus installed on a cluster with environment scope \"*\" OR a manually configured Prometheus to be available." +msgstr "" + +msgid "PrometheusService|Enable Prometheus to define custom metrics, using either option above" +msgstr "" + msgid "PrometheusService|Finding and configuring metrics..." msgstr "" +msgid "PrometheusService|Finding custom metrics..." +msgstr "" + msgid "PrometheusService|Install Prometheus on clusters" msgstr "" @@ -9307,12 +12259,21 @@ msgstr "" msgid "PrometheusService|More information" msgstr "" +msgid "PrometheusService|New metric" +msgstr "" + +msgid "PrometheusService|No custom metrics have been created. Create one using the button above" +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|These metrics will only be monitored after your first deployment to an environment" +msgstr "" + msgid "PrometheusService|Time-series monitoring service" msgstr "" @@ -9328,6 +12289,12 @@ msgstr "" msgid "Promote" msgstr "" +msgid "Promote issue to an epic" +msgstr "" + +msgid "Promote issue to an epic." +msgstr "" + msgid "Promote these project milestones into a group milestone." msgstr "" @@ -9346,6 +12313,21 @@ msgstr "" msgid "PromoteMilestone|Promotion failed - %{message}" msgstr "" +msgid "Promoted issue to an epic." +msgstr "" + +msgid "Promotions|Don't show me this again" +msgstr "" + +msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones." +msgstr "" + +msgid "Promotions|This feature is locked." +msgstr "" + +msgid "Promotions|Upgrade plan" +msgstr "" + msgid "Prompt users to upload SSH keys" msgstr "" @@ -9355,15 +12337,69 @@ msgstr "" msgid "Protected Branch" msgstr "" +msgid "Protected Environment" +msgstr "" + +msgid "Protected Environments" +msgstr "" + msgid "Protected Tag" msgstr "" +msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?" +msgstr "" + +msgid "ProtectedEnvironment|Allowed to deploy" +msgstr "" + +msgid "ProtectedEnvironment|Environment" +msgstr "" + +msgid "ProtectedEnvironment|Protect" +msgstr "" + +msgid "ProtectedEnvironment|Protect an environment" +msgstr "" + +msgid "ProtectedEnvironment|Protected Environment (%{protected_environments_count})" +msgstr "" + +msgid "ProtectedEnvironment|Protecting an environment restricts the users who can execute deployments." +msgstr "" + +msgid "ProtectedEnvironment|Select an environment" +msgstr "" + +msgid "ProtectedEnvironment|Select users" +msgstr "" + +msgid "ProtectedEnvironment|Select users to deploy and manage Feature Flag settings" +msgstr "" + +msgid "ProtectedEnvironment|There are currently no protected environments, protect an environment with the form above." +msgstr "" + +msgid "ProtectedEnvironment|Unprotect" +msgstr "" + +msgid "ProtectedEnvironment|Your environment can't be unprotected" +msgstr "" + +msgid "ProtectedEnvironment|Your environment has been protected." +msgstr "" + +msgid "ProtectedEnvironment|Your environment has been unprotected" +msgstr "" + msgid "Protip:" msgstr "" msgid "Provider" msgstr "" +msgid "Pseudonymizer data collection" +msgstr "" + msgid "Public" msgstr "" @@ -9382,9 +12418,24 @@ msgstr "" msgid "Public pipelines" msgstr "" +msgid "Pull" +msgstr "" + +msgid "Purchase more minutes" +msgstr "" + msgid "Push" msgstr "" +msgid "Push Rule updated successfully." +msgstr "" + +msgid "Push Rules" +msgstr "" + +msgid "Push Rules updated successfully." +msgstr "" + msgid "Push an existing Git repository" msgstr "" @@ -9400,6 +12451,15 @@ msgstr "" msgid "Push to create a project" msgstr "" +msgid "PushRule|Committer restriction" +msgstr "" + +msgid "Pushed" +msgstr "" + +msgid "Pushes" +msgstr "" + msgid "PushoverService|%{user_name} deleted branch \"%{ref}\"." msgstr "" @@ -9439,6 +12499,15 @@ msgstr "" msgid "PushoverService|Your user key" msgstr "" +msgid "Quarters" +msgstr "" + +msgid "Query" +msgstr "" + +msgid "Query is valid" +msgstr "" + msgid "Quick actions can be used in the issues description and comment boxes." msgstr "" @@ -9460,6 +12529,9 @@ msgstr "" msgid "Read more about project permissions <strong>%{link_to_help}</strong>" msgstr "" +msgid "Read more about related issues" +msgstr "" + msgid "Real-time features" msgstr "" @@ -9469,12 +12541,18 @@ msgstr "" msgid "Rebase in progress" msgstr "" +msgid "Receive alerts from manually configured Prometheus servers." +msgstr "" + msgid "Receive notifications about your own activity" msgstr "" msgid "Recent" msgstr "" +msgid "Recent Activity" +msgstr "" + msgid "Recent Project Activity" msgstr "" @@ -9487,20 +12565,32 @@ msgstr "" msgid "Recovery Codes" msgstr "" +msgid "Redirect to SAML provider to test configuration" +msgstr "" + msgid "Reference:" msgstr "" +msgid "Refresh" +msgstr "" + msgid "Refreshing in a second to show the updated status..." msgid_plural "Refreshing in %d seconds to show the updated status..." msgstr[0] "" msgstr[1] "" +msgid "Regenerate instance ID" +msgstr "" + msgid "Regenerate key" msgstr "" msgid "Regenerate recovery codes" msgstr "" +msgid "Regenerating the instance ID can break integration depending on the client you are using." +msgstr "" + msgid "Regex pattern" msgstr "" @@ -9528,6 +12618,9 @@ msgstr "" msgid "Register with two-factor app" msgstr "" +msgid "Registration" +msgstr "" + msgid "Related Deployed Jobs" msgstr "" @@ -9543,6 +12636,9 @@ msgstr "" msgid "Related Merged Requests" msgstr "" +msgid "Related issues" +msgstr "" + msgid "Related merge requests" msgstr "" @@ -9561,21 +12657,39 @@ msgstr "" msgid "Remove" msgstr "" +msgid "Remove %{displayReference}" +msgstr "" + msgid "Remove Runner" msgstr "" +msgid "Remove all approvals in a merge request when new commits are pushed to its source branch" +msgstr "" + msgid "Remove all or specific assignee(s)" msgstr "" msgid "Remove all or specific label(s)" msgstr "" +msgid "Remove approvers" +msgstr "" + +msgid "Remove approvers?" +msgstr "" + msgid "Remove assignee" msgstr "" msgid "Remove avatar" msgstr "" +msgid "Remove card" +msgstr "" + +msgid "Remove child epic from an epic" +msgstr "" + msgid "Remove due date" msgstr "" @@ -9585,12 +12699,18 @@ msgstr "" msgid "Remove from board" msgstr "" +msgid "Remove from epic" +msgstr "" + msgid "Remove group" msgstr "" msgid "Remove milestone" msgstr "" +msgid "Remove parent epic from an epic" +msgstr "" + msgid "Remove priority" msgstr "" @@ -9606,21 +12726,36 @@ msgstr "" msgid "Remove time estimate" msgstr "" +msgid "Removed" +msgstr "" + msgid "Removed %{assignee_text} %{assignee_references}." msgstr "" +msgid "Removed %{epic_ref} from child epics." +msgstr "" + msgid "Removed %{label_references} %{label_text}." msgstr "" msgid "Removed %{milestone_reference} milestone." msgstr "" +msgid "Removed %{type} with id %{id}" +msgstr "" + msgid "Removed all labels." msgstr "" +msgid "Removed an issue from an epic." +msgstr "" + msgid "Removed group can not be restored!" msgstr "" +msgid "Removed parent epic %{epic_ref}." +msgstr "" + msgid "Removed projects cannot be restored!" msgstr "" @@ -9636,6 +12771,9 @@ msgstr "" msgid "Removes %{assignee_text} %{assignee_references}." msgstr "" +msgid "Removes %{epic_ref} from child epics." +msgstr "" + msgid "Removes %{label_references} %{label_text}." msgstr "" @@ -9645,6 +12783,12 @@ msgstr "" msgid "Removes all labels." msgstr "" +msgid "Removes an issue from an epic." +msgstr "" + +msgid "Removes parent epic %{epic_ref}." +msgstr "" + msgid "Removes spent time." msgstr "" @@ -9657,6 +12801,9 @@ msgstr "" msgid "Removing group will cause all child projects and resources to be removed." msgstr "" +msgid "Removing license…" +msgstr "" + msgid "Removing the project will delete its repository and all related resources including issues, merge requests etc." msgstr "" @@ -9669,6 +12816,9 @@ msgstr "" msgid "Rename folder" msgstr "" +msgid "Reopen epic" +msgstr "" + msgid "Reopen milestone" msgstr "" @@ -9681,6 +12831,9 @@ msgstr "" msgid "Reopens this %{quick_action_target}." msgstr "" +msgid "Repair authentication" +msgstr "" + msgid "Replace" msgstr "" @@ -9699,6 +12852,12 @@ msgstr "" msgid "Reply to this email directly or %{view_it_on_gitlab}." msgstr "" +msgid "Reply..." +msgstr "" + +msgid "Repo by URL" +msgstr "" + msgid "Report abuse to admin" msgstr "" @@ -9708,18 +12867,39 @@ msgstr "" msgid "Reports|%{failedString} and %{resolvedString}" msgstr "" +msgid "Reports|Actions" +msgstr "" + msgid "Reports|Class" msgstr "" msgid "Reports|Classname" msgstr "" +msgid "Reports|Confidence" +msgstr "" + msgid "Reports|Execution time" msgstr "" msgid "Reports|Failure" msgstr "" +msgid "Reports|Metrics reports are loading" +msgstr "" + +msgid "Reports|Metrics reports changed on %{numberOfChanges} %{pointsString}" +msgstr "" + +msgid "Reports|Metrics reports did not change" +msgstr "" + +msgid "Reports|Metrics reports failed loading results" +msgstr "" + +msgid "Reports|Severity" +msgstr "" + msgid "Reports|System output" msgstr "" @@ -9732,6 +12912,9 @@ msgstr "" msgid "Reports|Test summary results are being parsed" msgstr "" +msgid "Reports|Vulnerability" +msgstr "" + msgid "Reports|no changed test results" msgstr "" @@ -9756,6 +12939,9 @@ msgstr "" msgid "Repository cleanup has started. You will receive an email once the cleanup operation is complete." msgstr "" +msgid "Repository has no locks." +msgstr "" + msgid "Repository maintenance" msgstr "" @@ -9771,6 +12957,9 @@ msgstr "" msgid "Repository: %{counter_repositories} / Wikis: %{counter_wikis} / Build Artifacts: %{counter_build_artifacts} / LFS: %{counter_lfs_objects}" msgstr "" +msgid "RepositorySettingsAccessLevel|Select" +msgstr "" + msgid "Request Access" msgstr "" @@ -9789,9 +12978,25 @@ msgstr "" msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab." msgstr "" +msgid "Require approval from code owners" +msgstr "" + +msgid "Require user password to approve" +msgstr "" + msgid "Require users to prove ownership of custom domains" msgstr "" +msgid "Requires approval from %{names}." +msgid_plural "Requires %{count} more approvals from %{names}." +msgstr[0] "" +msgstr[1] "" + +msgid "Requires approval." +msgid_plural "Requires %d more approvals." +msgstr[0] "" +msgstr[1] "" + msgid "Resend confirmation email" msgstr "" @@ -9801,15 +13006,30 @@ msgstr "" msgid "Resend it" msgstr "" +msgid "Reset authorization key" +msgstr "" + +msgid "Reset authorization key?" +msgstr "" + msgid "Reset health check access token" msgstr "" +msgid "Reset key" +msgstr "" + msgid "Reset runners registration token" msgstr "" msgid "Reset template" msgstr "" +msgid "Resetting the authorization key for this project will require updating the authorization key in every alert source it is enabled in." +msgstr "" + +msgid "Resetting the authorization key will invalidate the previous key. Existing alert configurations will need to be updated with the new key." +msgstr "" + msgid "Resolve all threads in new issue" msgstr "" @@ -9840,6 +13060,12 @@ msgstr "" msgid "Resolves IP addresses once and uses them to submit requests" msgstr "" +msgid "Response" +msgstr "" + +msgid "Response didn't include `service_desk_address`" +msgstr "" + msgid "Response metrics (AWS ELB)" msgstr "" @@ -9858,9 +13084,21 @@ msgstr "" msgid "Response metrics (NGINX)" msgstr "" +msgid "Restart Terminal" +msgstr "" + +msgid "Restrict access by IP address" +msgstr "" + +msgid "Restrict membership by email" +msgstr "" + msgid "Resume" msgstr "" +msgid "Resume replication" +msgstr "" + msgid "Retry" msgstr "" @@ -9893,6 +13131,9 @@ msgstr "" msgid "Review" msgstr "" +msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"." +msgstr "" + msgid "Reviewing" msgstr "" @@ -9914,9 +13155,21 @@ msgstr "" msgid "RightSidebar|deleting the" msgstr "" +msgid "Roadmap" +msgstr "" + +msgid "Rollback" +msgstr "" + +msgid "Run CI/CD pipelines for external repositories" +msgstr "" + msgid "Run housekeeping" msgstr "" +msgid "Run tests against your code live using the Web Terminal" +msgstr "" + msgid "Run untagged jobs" msgstr "" @@ -9965,6 +13218,12 @@ msgstr "" msgid "Runners page" msgstr "" +msgid "Runners page." +msgstr "" + +msgid "Runners|You have used %{quotaUsed} out of %{quotaLimit} of your shared Runners pipeline minutes." +msgstr "" + msgid "Running" msgstr "" @@ -9974,6 +13233,15 @@ msgstr "" msgid "Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects." msgstr "" +msgid "SAML SSO" +msgstr "" + +msgid "SAML SSO for %{group_name}" +msgstr "" + +msgid "SAML for %{group_name}" +msgstr "" + msgid "SSH Key" msgstr "" @@ -10013,6 +13281,9 @@ msgstr "" msgid "Save changes" msgstr "" +msgid "Save changes before testing" +msgstr "" + msgid "Save comment" msgstr "" @@ -10055,6 +13326,9 @@ msgstr "" msgid "Scope not supported with disabled 'users_search' feature!" msgstr "" +msgid "Scoped issue boards" +msgstr "" + msgid "Scoped label" msgstr "" @@ -10085,6 +13359,9 @@ msgstr "" msgid "Search" msgstr "" +msgid "Search an environment spec" +msgstr "" + msgid "Search branches" msgstr "" @@ -10094,6 +13371,9 @@ msgstr "" msgid "Search files" msgstr "" +msgid "Search for a LDAP group" +msgstr "" + msgid "Search for a group" msgstr "" @@ -10133,6 +13413,9 @@ msgstr "" msgid "Search users" msgstr "" +msgid "Search users or groups" +msgstr "" + msgid "Search your projects" msgstr "" @@ -10217,9 +13500,123 @@ msgid_plural "SearchResults|users" msgstr[0] "" msgstr[1] "" +msgid "Seats currently in use" +msgstr "" + +msgid "Seats in license" +msgstr "" + msgid "Secret" msgstr "" +msgid "Security" +msgstr "" + +msgid "Security & Compliance" +msgstr "" + +msgid "Security Dashboard" +msgstr "" + +msgid "Security Dashboard|Error fetching the dashboard data. Please check your network connection and try again." +msgstr "" + +msgid "Security Dashboard|Error fetching the vulnerability counts. Please check your network connection and try again." +msgstr "" + +msgid "Security Dashboard|Error fetching the vulnerability list. Please check your network connection and try again." +msgstr "" + +msgid "Security Dashboard|Issue Created" +msgstr "" + +msgid "Security Reports|Comment added to '%{vulnerabilityName}'" +msgstr "" + +msgid "Security Reports|Comment deleted on '%{vulnerabilityName}'" +msgstr "" + +msgid "Security Reports|Comment edited on '%{vulnerabilityName}'" +msgstr "" + +msgid "Security Reports|Create issue" +msgstr "" + +msgid "Security Reports|Dismiss vulnerability" +msgstr "" + +msgid "Security Reports|Dismissed '%{vulnerabilityName}'" +msgstr "" + +msgid "Security Reports|Either you don't have permission to view this dashboard or the dashboard has not been setup. Please check your permission settings with your administrator or check your dashboard configurations to proceed." +msgstr "" + +msgid "Security Reports|Learn more about setting up your dashboard" +msgstr "" + +msgid "Security Reports|More info" +msgstr "" + +msgid "Security Reports|Oops, something doesn't seem right." +msgstr "" + +msgid "Security Reports|There was an error adding the comment." +msgstr "" + +msgid "Security Reports|There was an error creating the issue." +msgstr "" + +msgid "Security Reports|There was an error creating the merge request." +msgstr "" + +msgid "Security Reports|There was an error deleting the comment." +msgstr "" + +msgid "Security Reports|There was an error dismissing the vulnerability." +msgstr "" + +msgid "Security Reports|There was an error reverting the dismissal." +msgstr "" + +msgid "Security Reports|There was an error reverting this dismissal." +msgstr "" + +msgid "Security Reports|Undo dismiss" +msgstr "" + +msgid "Security Reports|We've found no vulnerabilities for your group" +msgstr "" + +msgid "Security Reports|While it's rare to have no vulnerabilities for your group, it can happen. In any event, we ask that you please double check your settings to make sure you've set up your dashboard correctly." +msgstr "" + +msgid "Security dashboard" +msgstr "" + +msgid "SecurityDashboard| The security dashboard displays the latest security report. Use it to find and fix vulnerabilities." +msgstr "" + +msgid "SecurityDashboard|Confidence" +msgstr "" + +msgid "SecurityDashboard|Hide dismissed" +msgstr "" + +msgid "SecurityDashboard|Monitor vulnerabilities in your code" +msgstr "" + +msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered" +msgstr "" + +msgid "SecurityDashboard|Project" +msgstr "" + +msgid "SecurityDashboard|Report type" +msgstr "" + +msgid "SecurityDashboard|Severity" +msgstr "" + msgid "See metrics" msgstr "" @@ -10232,12 +13629,21 @@ msgstr "" msgid "Select Archive Format" msgstr "" +msgid "Select GitLab project to link with your Slack team" +msgstr "" + +msgid "Select Page" +msgstr "" + msgid "Select a file from the left sidebar to begin editing. Afterwards, you'll be able to commit your changes." msgstr "" msgid "Select a group to invite" msgstr "" +msgid "Select a label" +msgstr "" + msgid "Select a namespace to fork the project" msgstr "" @@ -10247,6 +13653,15 @@ msgstr "" msgid "Select a project" msgstr "" +msgid "Select a project to read Insights configuration file" +msgstr "" + +msgid "Select a repository" +msgstr "" + +msgid "Select a template repository" +msgstr "" + msgid "Select a timezone" msgstr "" @@ -10259,9 +13674,18 @@ msgstr "" msgid "Select branch/tag" msgstr "" +msgid "Select group or project" +msgstr "" + +msgid "Select labels" +msgstr "" + msgid "Select merge moment" msgstr "" +msgid "Select milestone" +msgstr "" + msgid "Select private project" msgstr "" @@ -10274,6 +13698,9 @@ msgstr "" msgid "Select project to choose zone" msgstr "" +msgid "Select projects" +msgstr "" + msgid "Select projects you want to import." msgstr "" @@ -10286,12 +13713,24 @@ msgstr "" msgid "Select the branch you want to set as the default for this project. All merge requests and commits will automatically be made against this branch unless you specify a different one." msgstr "" +msgid "Select the custom project template source group." +msgstr "" + +msgid "Select timeframe" +msgstr "" + +msgid "Select user" +msgstr "" + msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users." msgstr "" msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user." msgstr "" +msgid "Send a separate email notification to Developers." +msgstr "" + msgid "Send confirmation email" msgstr "" @@ -10316,6 +13755,9 @@ msgstr "" msgid "September" msgstr "" +msgid "SeriesFinalConjunction|and" +msgstr "" + msgid "Serve repository static objects (e.g. archives, blobs, ...) from an external storage (e.g. a CDN)." msgstr "" @@ -10397,6 +13839,9 @@ msgstr "" msgid "Service" msgstr "" +msgid "Service Desk" +msgstr "" + msgid "Service Templates" msgstr "" @@ -10409,15 +13854,30 @@ msgstr "" msgid "Session expiration, projects limit and attachment size." msgstr "" +msgid "Set %{epic_ref} as parent epic." +msgstr "" + +msgid "Set a default template for issue descriptions." +msgstr "" + +msgid "Set a number of approvals required, the approvers and other approval settings." +msgstr "" + msgid "Set a password on your account to pull or push via %{protocol}." msgstr "" +msgid "Set a template repository for projects in this group" +msgstr "" + msgid "Set default and restrict visibility levels. Configure import sources and git access protocol." msgstr "" msgid "Set due date" msgstr "" +msgid "Set instance-wide template repository" +msgstr "" + msgid "Set max session time for web terminal." msgstr "" @@ -10430,6 +13890,9 @@ msgstr "" msgid "Set notification email for abuse reports." msgstr "" +msgid "Set parent epic to an epic" +msgstr "" + msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authentication." msgstr "" @@ -10451,6 +13914,9 @@ msgstr "" msgid "Set the maximum file size for each job's artifacts" msgstr "" +msgid "Set the maximum number of pipeline minutes that a group can use on shared Runners per month. 0 for unlimited." +msgstr "" + msgid "Set the milestone to %{milestone_reference}." msgstr "" @@ -10469,6 +13935,9 @@ msgstr "" msgid "Set up a specific Runner automatically" msgstr "" +msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}" +msgstr "" + msgid "Set up new U2F device" msgstr "" @@ -10478,6 +13947,12 @@ msgstr "" msgid "Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically." msgstr "" +msgid "Set weight" +msgstr "" + +msgid "Set weight to %{weight}." +msgstr "" + msgid "SetPasswordToCloneLink|set a password" msgstr "" @@ -10505,6 +13980,9 @@ msgstr "" msgid "SetStatusModal|What's your status?" msgstr "" +msgid "Sets %{epic_ref} as parent epic." +msgstr "" + msgid "Sets target branch to %{branch_name}." msgstr "" @@ -10517,18 +13995,36 @@ msgstr "" msgid "Sets time estimate to %{time_estimate}." msgstr "" +msgid "Sets weight to %{weight}." +msgstr "" + msgid "Settings" msgstr "" msgid "Share" msgstr "" +msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider" +msgstr "" + msgid "Shared Runners" msgstr "" msgid "Shared projects" msgstr "" +msgid "Shared runners help link" +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 "Sherlock Transactions" msgstr "" @@ -10579,6 +14075,12 @@ msgid_plural "Showing %d events" msgstr[0] "" msgstr[1] "" +msgid "Showing Latest Version" +msgstr "" + +msgid "Showing Version #%{versionNumber}" +msgstr "" + msgid "Showing all issues" msgstr "" @@ -10588,24 +14090,54 @@ msgstr "" msgid "Side-by-side" msgstr "" +msgid "Sidebar|Change weight" +msgstr "" + +msgid "Sidebar|None" +msgstr "" + +msgid "Sidebar|Only numeral characters allowed" +msgstr "" + +msgid "Sidebar|Weight" +msgstr "" + msgid "Sign in" msgstr "" msgid "Sign in / Register" msgstr "" +msgid "Sign in to \"%{group_name}\"" +msgstr "" + +msgid "Sign in using smart card" +msgstr "" + msgid "Sign in via 2FA code" msgstr "" msgid "Sign in with Google" msgstr "" +msgid "Sign in with Single Sign-On" +msgstr "" + +msgid "Sign in with smart card" +msgstr "" + msgid "Sign out" msgstr "" +msgid "Sign out & Register" +msgstr "" + msgid "Sign up" msgstr "" +msgid "Sign up was successful! Please confirm your email to sign in." +msgstr "" + msgid "Sign-in restrictions" msgstr "" @@ -10633,12 +14165,30 @@ msgstr "" msgid "Similar issues" msgstr "" +msgid "Single or combined queries" +msgstr "" + msgid "Site ID" msgstr "" +msgid "Size" +msgstr "" + msgid "Size and domain settings for static websites" msgstr "" +msgid "Size limit per repository (MB)" +msgstr "" + +msgid "Skip this for now" +msgstr "" + +msgid "Slack application" +msgstr "" + +msgid "Slack integration allows you to interact with GitLab via slash commands in a chat window." +msgstr "" + msgid "SlackService|2. Paste the <strong>Token</strong> into the field below" msgstr "" @@ -10657,6 +14207,12 @@ msgstr "" msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job" msgstr "" +msgid "Smartcard" +msgstr "" + +msgid "Smartcard authentication failed: client certificate header is missing." +msgstr "" + msgid "Snippet Contents" msgstr "" @@ -10705,6 +14261,9 @@ msgstr "" msgid "Something went wrong on our end. Please try again!" msgstr "" +msgid "Something went wrong on our end. Please try again." +msgstr "" + msgid "Something went wrong trying to change the confidentiality of this issue" msgstr "" @@ -10735,9 +14294,15 @@ msgstr "" msgid "Something went wrong while editing your comment. Please try again." msgstr "" +msgid "Something went wrong while fetching %{listType} list" +msgstr "" + msgid "Something went wrong while fetching comments. Please try again." msgstr "" +msgid "Something went wrong while fetching group member contributions" +msgstr "" + msgid "Something went wrong while fetching latest comments." msgstr "" @@ -10765,6 +14330,15 @@ msgstr "" msgid "Something went wrong while stopping this environment. Please try again." msgstr "" +msgid "Something went wrong, unable to add %{project} to dashboard" +msgstr "" + +msgid "Something went wrong, unable to get projects" +msgstr "" + +msgid "Something went wrong, unable to remove project" +msgstr "" + msgid "Something went wrong, unable to search projects" msgstr "" @@ -10774,6 +14348,9 @@ msgstr "" msgid "Something went wrong. Try again later." msgstr "" +msgid "Sorry, no epics matched your search" +msgstr "" + msgid "Sorry, no projects matched your search" msgstr "" @@ -10828,6 +14405,9 @@ msgstr "" msgid "SortOptions|Least popular" msgstr "" +msgid "SortOptions|Less weight" +msgstr "" + msgid "SortOptions|Manual" msgstr "" @@ -10840,6 +14420,9 @@ msgstr "" msgid "SortOptions|Milestone due soon" msgstr "" +msgid "SortOptions|More weight" +msgstr "" + msgid "SortOptions|Most popular" msgstr "" @@ -10894,12 +14477,18 @@ msgstr "" msgid "SortOptions|Stars" msgstr "" +msgid "SortOptions|Start date" +msgstr "" + msgid "SortOptions|Start later" msgstr "" msgid "SortOptions|Start soon" msgstr "" +msgid "SortOptions|Weight" +msgstr "" + msgid "Source" msgstr "" @@ -10990,6 +14579,12 @@ msgstr "" msgid "Stars" msgstr "" +msgid "Start GitLab Ultimate trial" +msgstr "" + +msgid "Start Web Terminal" +msgstr "" + msgid "Start a %{new_merge_request} with these changes" msgstr "" @@ -11005,12 +14600,24 @@ msgstr "" msgid "Start and due date" msgstr "" +msgid "Start by choosing a group to see how your team is spending time. You can then drill down to the project level." +msgstr "" + +msgid "Start by choosing a group to start exploring the merge requests in that group. You can then proceed to filter by projects, labels, milestones, authors and assignees." +msgstr "" + msgid "Start cleanup" msgstr "" msgid "Start date" msgstr "" +msgid "Start merge train" +msgstr "" + +msgid "Start merge train when pipeline succeeds" +msgstr "" + msgid "Start search" msgstr "" @@ -11026,6 +14633,9 @@ msgstr "" msgid "Start thread & reopen %{noteable_name}" msgstr "" +msgid "Start your trial" +msgstr "" + msgid "Started" msgstr "" @@ -11035,6 +14645,9 @@ msgstr "" msgid "Started asynchronous removal of all repository check states." msgstr "" +msgid "Starting..." +msgstr "" + msgid "Starts %{startsIn}" msgstr "" @@ -11056,6 +14669,9 @@ msgstr "" msgid "Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments." msgstr "" +msgid "Stop Terminal" +msgstr "" + msgid "Stop environment" msgstr "" @@ -11071,6 +14687,9 @@ msgstr "" msgid "Stopping this environment is currently not possible as a deployment is in progress" msgstr "" +msgid "Stopping..." +msgstr "" + msgid "Storage" msgstr "" @@ -11110,6 +14729,9 @@ msgstr "" msgid "Submit issue" msgstr "" +msgid "Submit review" +msgstr "" + msgid "Submit search" msgstr "" @@ -11140,6 +14762,75 @@ msgstr "" msgid "Subscription" msgstr "" +msgid "SubscriptionTable|Billing" +msgstr "" + +msgid "SubscriptionTable|Free" +msgstr "" + +msgid "SubscriptionTable|GitLab allows you to continue using your subscription even if you exceed the number of seats you purchased. You will be required to pay for these seats upon renewal." +msgstr "" + +msgid "SubscriptionTable|Last invoice" +msgstr "" + +msgid "SubscriptionTable|Loading subscriptions" +msgstr "" + +msgid "SubscriptionTable|Manage" +msgstr "" + +msgid "SubscriptionTable|Max seats used" +msgstr "" + +msgid "SubscriptionTable|Next invoice" +msgstr "" + +msgid "SubscriptionTable|Seats currently in use" +msgstr "" + +msgid "SubscriptionTable|Seats in subscription" +msgstr "" + +msgid "SubscriptionTable|Seats owed" +msgstr "" + +msgid "SubscriptionTable|Subscription end date" +msgstr "" + +msgid "SubscriptionTable|Subscription start date" +msgstr "" + +msgid "SubscriptionTable|This is the last time the GitLab.com team was in contact with you to settle any outstanding balances." +msgstr "" + +msgid "SubscriptionTable|This is the maximum number of users that have existed at the same time since this subscription started." +msgstr "" + +msgid "SubscriptionTable|This is the next date when the GitLab.com team is scheduled to get in contact with you to settle any outstanding balances." +msgstr "" + +msgid "SubscriptionTable|This is the number of seats you will be required to purchase if you update to a paid plan." +msgstr "" + +msgid "SubscriptionTable|Trial" +msgstr "" + +msgid "SubscriptionTable|Trial end date" +msgstr "" + +msgid "SubscriptionTable|Trial start date" +msgstr "" + +msgid "SubscriptionTable|Upgrade" +msgstr "" + +msgid "SubscriptionTable|Usage" +msgstr "" + +msgid "SubscriptionTable|Usage count is performed once a day at 12:00 PM." +msgstr "" + msgid "Subtracted" msgstr "" @@ -11260,6 +14951,12 @@ msgstr "" msgid "Switch to the source to copy it to the clipboard" msgstr "" +msgid "Sync information" +msgstr "" + +msgid "System" +msgstr "" + msgid "System Hooks" msgstr "" @@ -11410,12 +15107,18 @@ msgstr "" msgid "Terminal for environment" msgstr "" +msgid "Terminal sync service is running" +msgstr "" + msgid "Terms of Service Agreement and Privacy Policy" msgstr "" msgid "Terms of Service and Privacy Policy" msgstr "" +msgid "Test SAML SSO" +msgstr "" + msgid "Test coverage parsing" msgstr "" @@ -11449,14 +15152,29 @@ msgstr "" msgid "TestHooks|Ensure the wiki is enabled and has pages." msgstr "" +msgid "Thank you for signing up for your free trial! You will get additional instructions in your inbox shortly." +msgstr "" + msgid "Thank you for your report. A GitLab administrator will look into it shortly." msgstr "" +msgid "Thanks! Don't show me this again" +msgstr "" + +msgid "The \"%{group_path}\" group allows you to sign in with your Single Sign-On Account" +msgstr "" + msgid "The %{type} contains the following error:" msgid_plural "The %{type} contains the following errors:" msgstr[0] "" msgstr[1] "" +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 CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment." +msgstr "" + msgid "The Git LFS objects will <strong>not</strong> be synced." msgstr "" @@ -11469,6 +15187,12 @@ msgstr "" msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS." msgstr "" +msgid "The amount of seconds after which a request to get a secondary node status will time out." +msgstr "" + +msgid "The branch for this project has no active pipeline configuration." +msgstr "" + msgid "The character highlighter helps you keep the subject line to %{titleLength} characters and wrap the body at %{bodyLength} so they are readable in git." msgstr "" @@ -11478,15 +15202,27 @@ msgstr "" msgid "The collection of events added to the data gathered for that stage." msgstr "" +msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination." +msgstr "" + msgid "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository." msgstr "" +msgid "The dependency list details information about the components used within your project." +msgstr "" + msgid "The deployment of this job to %{environmentLink} did not succeed." msgstr "" msgid "The directory has been successfully created." msgstr "" +msgid "The domain you entered is misformatted." +msgstr "" + +msgid "The domain you entered is not allowed." +msgstr "" + msgid "The entered user map is not a valid JSON user map." msgstr "" @@ -11538,6 +15274,15 @@ msgstr "" msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage." msgstr "" +msgid "The license was removed. GitLab has fallen back on the previous license." +msgstr "" + +msgid "The license was removed. GitLab now no longer has a valid license." +msgstr "" + +msgid "The license was successfully uploaded and is now active. You can see the details below." +msgstr "" + msgid "The maximum file size allowed is %{size}." msgstr "" @@ -11607,6 +15352,9 @@ msgstr "" msgid "The project was successfully imported." msgstr "" +msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory." +msgstr "" + msgid "The remote mirror took to long to complete." msgstr "" @@ -11619,6 +15367,9 @@ msgstr "" msgid "The repository for this project is empty" msgstr "" +msgid "The repository is being updated..." +msgstr "" + msgid "The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>." msgstr "" @@ -11628,6 +15379,9 @@ 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 schedule time must be in the future!" msgstr "" @@ -11652,6 +15406,9 @@ msgstr "" msgid "The time taken by each data entry gathered by that stage." msgstr "" +msgid "The unique identifier for the Geo node. Must match `geo_node_name` if it is set in gitlab.rb, otherwise it must match `external_url` with a trailing slash" +msgstr "" + msgid "The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination." msgstr "" @@ -11673,6 +15430,9 @@ msgstr "" msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below." msgstr "" +msgid "The user-facing URL of the Geo node" +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 "" @@ -11691,12 +15451,18 @@ msgstr "" msgid "There are no archived projects yet" msgstr "" +msgid "There are no charts configured for this page" +msgstr "" + msgid "There are no closed issues" msgstr "" msgid "There are no closed merge requests" msgstr "" +msgid "There are no custom project templates set up for this GitLab instance. They are enabled from GitLab's Admin Area. Contact your GitLab instance administrator to setup custom project templates." +msgstr "" + msgid "There are no issues to show" msgstr "" @@ -11712,6 +15478,9 @@ msgstr "" msgid "There are no open merge requests" msgstr "" +msgid "There are no packages yet" +msgstr "" + msgid "There are no projects shared with this group yet" msgstr "" @@ -11733,12 +15502,33 @@ msgstr "" msgid "There was an error %{message} todo." msgstr "" +msgid "There was an error adding a To Do." +msgstr "" + +msgid "There was an error creating the issue" +msgstr "" + +msgid "There was an error deleting the To Do." +msgstr "" + +msgid "There was an error fetching configuration for charts" +msgstr "" + +msgid "There was an error gathering the chart data" +msgstr "" + msgid "There was an error loading users activity calendar." msgstr "" msgid "There was an error removing the e-mail." msgstr "" +msgid "There was an error resetting group pipeline minutes." +msgstr "" + +msgid "There was an error resetting user pipeline minutes." +msgstr "" + msgid "There was an error saving your changes." msgstr "" @@ -11748,6 +15538,9 @@ msgstr "" msgid "There was an error subscribing to this label." msgstr "" +msgid "There was an error trying to validate your query" +msgstr "" + msgid "There was an error when reseting email token." msgstr "" @@ -11796,9 +15589,18 @@ msgstr "" msgid "This application will be able to:" msgstr "" +msgid "This block is self-referential" +msgstr "" + +msgid "This board's scope is reduced" +msgstr "" + msgid "This branch has changed since you started editing. Would you like to create a new branch?" msgstr "" +msgid "This chart could not be displayed" +msgstr "" + msgid "This comment has changed since you started editing, please review the %{startTag}updated comment%{endTag} to ensure information is not lost." msgstr "" @@ -11820,6 +15622,12 @@ msgstr "" msgid "This container registry has been scheduled for deletion." msgstr "" +msgid "This date is after the due date, so this epic won't appear in the roadmap." +msgstr "" + +msgid "This date is before the start date, so this epic won't appear in the roadmap." +msgstr "" + msgid "This device has already been registered with us." msgstr "" @@ -11838,6 +15646,9 @@ msgstr "" msgid "This domain is not verified. You will need to verify ownership before access is enabled." msgstr "" +msgid "This environment has no deployments yet." +msgstr "" + msgid "This feature is in development. Please disable the `job_log_json` feature flag" msgstr "" @@ -11853,6 +15664,9 @@ msgstr "" msgid "This group does not provide any group Runners yet." msgstr "" +msgid "This group, including all subgroups, projects and git repositories, will only be reachable from the specified IP address range. Multiple addresses are supported with comma delimiters.<br>Example: <code>192.168.0.0/24,192.168.1.0/24</code>. %{read_more_link}." +msgstr "" + msgid "This is a \"Ghost User\", created to hold all issues authored by users that have since been deleted. This user cannot be removed." msgstr "" @@ -11874,6 +15688,9 @@ msgstr "" msgid "This is the author's first Merge Request to this project." msgstr "" +msgid "This is the maximum number of users that have existed at the same time since the license started. This is the minimum number of seats you will need to buy when you renew your license." +msgstr "" + msgid "This is your current session" msgstr "" @@ -12018,9 +15835,18 @@ msgstr "" msgid "This user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches." msgstr "" +msgid "This user will be the author of all events in the activity feed that are the result of an update, like new branches being created or new commits being pushed to existing branches. Upon creation or when reassigning you can only assign yourself to be the mirror user." +msgstr "" + +msgid "This will redirect you to an external sign in page." +msgstr "" + msgid "This will remove the fork relationship to source project" msgstr "" +msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here." +msgstr "" + msgid "Thursday" msgstr "" @@ -12045,6 +15871,15 @@ msgstr "" msgid "Time estimate" msgstr "" +msgid "Time from first comment to last commit" +msgstr "" + +msgid "Time from first commit until first comment" +msgstr "" + +msgid "Time from last commit to merge" +msgstr "" + msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied." msgstr "" @@ -12054,6 +15889,9 @@ msgstr "" msgid "Time spent" msgstr "" +msgid "Time to merge" +msgstr "" + msgid "Time tracking" msgstr "" @@ -12201,6 +16039,9 @@ msgstr "" msgid "Timeago|right now" msgstr "" +msgid "Timeframe" +msgstr "" + msgid "Timeout" msgstr "" @@ -12247,9 +16088,18 @@ msgstr "" msgid "To add the entry manually, provide the following details to the application on your phone." msgstr "" +msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect." +msgstr "" + msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories." msgstr "" +msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:" +msgstr "" + +msgid "To connect an SVN repository, check out %{svn_link}." +msgstr "" + msgid "To define internal users, first enable new users set to external" msgstr "" @@ -12259,6 +16109,9 @@ msgstr "" msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import." msgstr "" +msgid "To get started, link this page to your Jaeger server, or find out how to %{link_start_tag}install Jaeger%{link_end_tag}" +msgstr "" + msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}." msgstr "" @@ -12283,6 +16136,12 @@ msgstr "" msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here." msgstr "" +msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>." +msgstr "" + +msgid "To open Jaeger and easily view tracing from GitLab, link the %{link} page to your server" +msgstr "" + msgid "To preserve performance only <strong>%{display_size} of %{real_size}</strong> files are displayed." msgstr "" @@ -12292,9 +16151,15 @@ msgstr "" msgid "To protect this issue's confidentiality, a private fork of this project was selected." msgstr "" +msgid "To receive alerts from manually configured Prometheus services, add the following URL and Authorization key to your Prometheus webhook config file. Learn more about %{linkStart}configuring Prometheus%{linkEnd} to send alerts to GitLab." +msgstr "" + msgid "To see all the user's personal access tokens you must impersonate them first." msgstr "" +msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:" +msgstr "" + msgid "To set up this service:" msgstr "" @@ -12313,9 +16178,15 @@ msgstr "" msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button." msgstr "" +msgid "To view the roadmap, add a start or due date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown." +msgstr "" + msgid "To widen your search, change or remove filters above" msgstr "" +msgid "To widen your search, change or remove filters." +msgstr "" + msgid "To-Do List" msgstr "" @@ -12352,6 +16223,9 @@ msgstr "" msgid "Toggle navigation" msgstr "" +msgid "Toggle project" +msgstr "" + msgid "Toggle sidebar" msgstr "" @@ -12385,6 +16259,12 @@ msgstr "" msgid "Topics" msgstr "" +msgid "Total" +msgstr "" + +msgid "Total Contributions" +msgstr "" + msgid "Total Time" msgstr "" @@ -12394,9 +16274,24 @@ msgstr "" msgid "Total: %{total}" msgstr "" +msgid "Tracing" +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 "Track your GitLab projects with GitLab for Slack." +msgstr "" + +msgid "Track your project with Audit Events." +msgstr "" + msgid "Transfer project" msgstr "" @@ -12433,12 +16328,21 @@ msgstr "" msgid "TransferProject|Transfer failed, please contact an admin." msgstr "" +msgid "Tree" +msgstr "" + msgid "Tree view" msgstr "" msgid "Trending" msgstr "" +msgid "Trigger pipelines for mirror updates" +msgstr "" + +msgid "Trigger pipelines when branches or tags are updated from the upstream repository. Depending on the activity of the upstream repository, this may greatly increase the load on your CI runners. Only enable this if you know they can handle the load." +msgstr "" + msgid "Trigger removed." msgstr "" @@ -12457,15 +16361,24 @@ msgstr "" msgid "Trigger was successfully updated." msgstr "" +msgid "Triggerer" +msgstr "" + msgid "Triggers can force a specific branch or tag to get rebuilt with an API call. These tokens will impersonate their associated user including their access to projects and their project permissions." msgstr "" +msgid "Troubleshoot and monitor your application with tracing" +msgstr "" + msgid "Try again" msgstr "" msgid "Try again?" msgstr "" +msgid "Try all GitLab has to offer for 30 days." +msgstr "" + msgid "Try to fork again" msgstr "" @@ -12481,6 +16394,9 @@ msgstr "" msgid "Turn On" msgstr "" +msgid "Turn on Service Desk" +msgstr "" + msgid "Twitter" msgstr "" @@ -12508,18 +16424,27 @@ msgstr "" msgid "U2F only works with HTTPS-enabled websites. Contact your administrator for more details." msgstr "" +msgid "URL" +msgstr "" + msgid "URL of the external storage that will serve the repository static objects (e.g. archives, blobs, ...)." msgstr "" msgid "Unable to apply suggestions to a deleted line." msgstr "" +msgid "Unable to build Slack link." +msgstr "" + msgid "Unable to connect to Prometheus server" msgstr "" msgid "Unable to connect to server: %{error}" msgstr "" +msgid "Unable to generate new instance ID" +msgstr "" + msgid "Unable to load the diff. %{button_try_again}" msgstr "" @@ -12532,9 +16457,15 @@ msgstr "" msgid "Unable to schedule a pipeline to run immediately" msgstr "" +msgid "Unable to sign you in to the group with SAML due to \"%{reason}\"" +msgstr "" + msgid "Unable to update label prioritization at this time" msgstr "" +msgid "Unable to update this epic at this time." +msgstr "" + msgid "Unable to update this issue at this time." msgstr "" @@ -12559,6 +16490,9 @@ msgstr "" msgid "Uninstalling" msgstr "" +msgid "Unknown" +msgstr "" + msgid "Unknown encryption strategy: %{encrypted_strategy}!" msgstr "" @@ -12568,6 +16502,9 @@ msgstr "" msgid "Unknown response text" msgstr "" +msgid "Unlimited" +msgstr "" + msgid "Unlock" msgstr "" @@ -12658,9 +16595,18 @@ msgstr "" msgid "Update" msgstr "" +msgid "Update all" +msgstr "" + +msgid "Update approval rule" +msgstr "" + msgid "Update failed" msgstr "" +msgid "Update failed. Please try again." +msgstr "" + msgid "Update it" msgstr "" @@ -12691,12 +16637,42 @@ msgstr "" msgid "Updated" msgstr "" +msgid "Updated %{updated_at} by %{updated_by}" +msgstr "" + msgid "Updated to" msgstr "" msgid "Updating" msgstr "" +msgid "Upgrade plan to unlock Canary Deployments feature" +msgstr "" + +msgid "Upgrade your plan" +msgstr "" + +msgid "Upgrade your plan to activate Advanced Global Search." +msgstr "" + +msgid "Upgrade your plan to activate Audit Events." +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 "Upgrade your plan to improve Merge Requests." +msgstr "" + msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:" msgstr "" @@ -12724,18 +16700,90 @@ msgstr "" msgid "UploadLink|click to upload" msgstr "" +msgid "Uploaded on" +msgstr "" + +msgid "Uploading changes to terminal" +msgstr "" + +msgid "Uploads" +msgstr "" + +msgid "Upstream" +msgstr "" + msgid "Upvotes" msgstr "" +msgid "Usage" +msgstr "" + msgid "Usage ping is not enabled" msgstr "" +msgid "Usage quotas help link" +msgstr "" + msgid "Usage statistics" msgstr "" +msgid "UsageQuota|%{help_link_start}Shared runners%{help_link_end} are disabled, so there are no limits set on pipeline usage" +msgstr "" + +msgid "UsageQuota|Artifacts" +msgstr "" + +msgid "UsageQuota|Buy additional minutes" +msgstr "" + +msgid "UsageQuota|Current period usage" +msgstr "" + +msgid "UsageQuota|LFS Storage" +msgstr "" + +msgid "UsageQuota|Packages" +msgstr "" + +msgid "UsageQuota|Pipelines" +msgstr "" + +msgid "UsageQuota|Repository" +msgstr "" + +msgid "UsageQuota|Storage" +msgstr "" + +msgid "UsageQuota|This namespace has no projects which use shared runners" +msgstr "" + +msgid "UsageQuota|Unlimited" +msgstr "" + +msgid "UsageQuota|Usage" +msgstr "" + +msgid "UsageQuota|Usage Quotas" +msgstr "" + +msgid "UsageQuota|Usage of group resources across the projects in the %{strong_start}%{group_name}%{strong_end} group" +msgstr "" + +msgid "UsageQuota|Usage since" +msgstr "" + +msgid "UsageQuota|Wiki" +msgstr "" + +msgid "Use %{code_start}::%{code_end} to create a %{link_start}scoped label set%{link_end} (eg. %{code_start}priority::1%{code_end})" +msgstr "" + msgid "Use <code>%{native_redirect_uri}</code> for local tests" msgstr "" +msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab" +msgstr "" + msgid "Use a hardware device to add the second factor of authentication." msgstr "" @@ -12757,6 +16805,15 @@ msgstr "" msgid "Use your global notification setting" msgstr "" +msgid "Use your smart card to authenticate with the LDAP server." +msgstr "" + +msgid "Used by members to sign in to your group in GitLab" +msgstr "" + +msgid "Used to help configure your identity provider" +msgstr "" + msgid "User %{current_user_username} has started impersonating %{username}" msgstr "" @@ -12790,6 +16847,9 @@ msgstr "" msgid "User map" msgstr "" +msgid "User pipeline minutes were successfully reset." +msgstr "" + msgid "User settings" msgstr "" @@ -12805,6 +16865,147 @@ msgstr "" msgid "User was successfully updated." msgstr "" +msgid "UserOnboardingTour|%{activeTour}/%{totalTours}" +msgstr "" + +msgid "UserOnboardingTour|%{completed}/%{total} steps completed" +msgstr "" + +msgid "UserOnboardingTour|%{emphasisStart}Well done!%{emphasisEnd}%{lineBreak}%{lineBreak}That's it for our guided tour, congratulations for making it all the way to the end!%{lineBreak}%{lineBreak}We hope this gave you a good overview of GitLab and how it can help you. We'll now show you how to create your own project and invite your colleagues." +msgstr "" + +msgid "UserOnboardingTour|Adding other members to a project is done through Project Settings. Click on %{emphasisStart}Settings%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|Alright, that's it for Commits. Let's take a look at the %{emphasisStart}Branches%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|Awesome! Now click on %{emphasisStart}Members%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|Click on one of the %{emphasisStart}Compare%{emphasisEnd} buttons to compare a branch to master." +msgstr "" + +msgid "UserOnboardingTour|Click on one of the %{emphasisStart}pipeline IDs%{emphasisEnd} to see the details of a pipeline." +msgstr "" + +msgid "UserOnboardingTour|Click to open the latest commit to see its details." +msgstr "" + +msgid "UserOnboardingTour|Close 'Learn GitLab'" +msgstr "" + +msgid "UserOnboardingTour|Commits are shown in chronological order and can be filtered by the commit message or by the branch." +msgstr "" + +msgid "UserOnboardingTour|Create a project" +msgstr "" + +msgid "UserOnboardingTour|Exit 'Learn GitLab'" +msgstr "" + +msgid "UserOnboardingTour|Got it" +msgstr "" + +msgid "UserOnboardingTour|Great job! %{clapHands} We hope the tour was helpful and that you learned how to use GitLab.%{lineBreak}%{lineBreak}We'd love to get your feedback on this tour.%{lineBreak}%{lineBreak}%{emphasisStart}How helpful would you say this guided tour was?%{emphasisEnd}%{lineBreak}%{lineBreak}" +msgstr "" + +msgid "UserOnboardingTour|Guided GitLab Tour" +msgstr "" + +msgid "UserOnboardingTour|Here you can compare the changes of this branch to another one. Changes are divided by files so that it's easier to see what was changed where." +msgstr "" + +msgid "UserOnboardingTour|Here you can create a project from scratch, start with a template or import a repository from other platforms. Whatever you choose, we'll guide you through the process.%{lineBreak}%{lineBreak}Choose a way to create a project and click on %{emphasisStart}Create Project%{emphasisEnd} to progress to the next step." +msgstr "" + +msgid "UserOnboardingTour|Here you can see the breakdown of the pipelines: its stages and jobs in each of the stages and their status.%{lineBreak}%{lineBreak}Our CI/CD pipelines are quite complex, most of our users have fewer and simpler pipelines." +msgstr "" + +msgid "UserOnboardingTour|Here you can see the current members of the project (just you at the moment) and invite new members.%{lineBreak}%{lineBreak}You can invite multiple members at once (existing GitLab users or invite by email) and you can also set their roles and permissions.%{lineBreak}%{lineBreak}Add a few members and click on %{emphasisStart}Add to project%{emphasisEnd} to complete this step." +msgstr "" + +msgid "UserOnboardingTour|Here you can see what changes were made with this commit, on what branch and if there's a related merge request. The status of the pipeline will also show up if CI/CD is set up.%{lineBreak}%{lineBreak}You can also comment on the lines of code that were changed and start a discussion with your colleagues!" +msgstr "" + +msgid "UserOnboardingTour|Here's an overview of branches in the %{emphasisStart}%{projectName}%{emphasisEnd} project. They're split into Active and Stale.%{lineBreak}%{lineBreak}From here, you can create a new merge request, from a branch or compare the branch to any other branch in the project. By default, it will compare it to the master branch." +msgstr "" + +msgid "UserOnboardingTour|Invite colleagues" +msgstr "" + +msgid "UserOnboardingTour|Issues are great for communicating and keeping track of progess in GitLab. These are all issues that are open in the %{emphasisStart}%{projectName}%{emphasisEnd}.%{lineBreak}%{lineBreak}You can help us improve GitLab by contributing work to issues that are labeled <span class=\"badge color-label accept-mr-label\">Accepting merge requests</span>.%{lineBreak}%{lineBreak}This list can be filtered by labels, milestones, assignees, authors... We'll show you how it looks like when the list is filtered by a label." +msgstr "" + +msgid "UserOnboardingTour|Learn GitLab" +msgstr "" + +msgid "UserOnboardingTour|Let's take a closer look at a merge request. Click on the title of one." +msgstr "" + +msgid "UserOnboardingTour|Let's take a closer look at all the commits. Click on %{emphasisStart}Commits%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|Let's take a closer look at the repository of this project. Click on %{emphasisStart}Repository%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|No thanks" +msgstr "" + +msgid "UserOnboardingTour|Ok, let's go" +msgstr "" + +msgid "UserOnboardingTour|Ok, show me" +msgstr "" + +msgid "UserOnboardingTour|Open one of the issues by clicking on its title." +msgstr "" + +msgid "UserOnboardingTour|Restart this step" +msgstr "" + +msgid "UserOnboardingTour|Skip this step" +msgstr "" + +msgid "UserOnboardingTour|Sweet! Your project was created is is ready to be used.%{lineBreak}%{lineBreak}You can start adding files to the repository or clone it. One last thing we want to show you is how to invite your colleagues to your new project." +msgstr "" + +msgid "UserOnboardingTour|Take a look. Here's a nifty menu for quickly creating issues, merge requests, snippets, projects and groups. Click on it and select \"New project\" from the \"GitLab\" section to get started." +msgstr "" + +msgid "UserOnboardingTour|Thanks for the feedback! %{thumbsUp}" +msgstr "" + +msgid "UserOnboardingTour|That's it for issues. Let'st take a look at %{emphasisStart}Merge Requests%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|That's it for merge requests. Now for the finla part of this guided tour - the %{emphasisStart}CI/CD%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|That's it for the Repository. Let's take a look at the %{emphasisStart}Issues%{emphasisEnd}." +msgstr "" + +msgid "UserOnboardingTour|The structure of this page is very similar to the onfe of issues. Status, description, discussion and the sidebar are all here.%{lineBreak}%{lineBreak}But take a look below the description and you'll notice that there's more information about the merge request, the CI/CD pipeline and the options for approving it.%{lineBreak}%{lineBreak}Below, alongside the discussion you can also see more information about commits in this merge request, the status of pipelines and review all changes that were made." +msgstr "" + +msgid "UserOnboardingTour|There's a lot of information here but don't worry, we'll go through it.%{lineBreak}%{lineBreak}On the top you can see the status of the issue and when it was opened and by whom. Directly below it is the issue description and below that are other %{emphasisStart}related issues%{emphasisEnd} and %{emphasisStart}merge requests%{emphasisEnd} (if any). Then below that is the %{emphasisStart}discussion%{emphasisEnd}, that's where most of the communication happens.%{lineBreak}%{lineBreak}On the right, there's a sidebar where you can view/change the %{emphasisStart}assignee, milestone, due date, labels, weight%{emphasisEnd}, etc." +msgstr "" + +msgid "UserOnboardingTour|These are all the CI/CD pipelines we have for our %{emphasisStart}%{projectName}%{emphasisEnd} project.%{lineBreak}%{lineBreak}Here you can see the status of each pipeline, for what commit it's running for, its stages and the status for them." +msgstr "" + +msgid "UserOnboardingTour|These are all the issues that are available for community contributions. Let's take a closer look at one of them." +msgstr "" + +msgid "UserOnboardingTour|This is an overview of all merge requests in this project. Similarly to the issues overview it can be filtered down by things like labels, milestones, authors, assignees, etc." +msgstr "" + +msgid "UserOnboardingTour|This is the repository for the %{emphasisStart}%{projectName}%{emphasisEnd} project. All our code is stored here. Feel free to explore around and take a closer look at folders and files.%{lineBreak}%{lineBreak}Above the file structure, you can see the latest commit, who the author is and the status of the CI/CD pipeline.%{lineBreak}%{lineBreak}If you scroll down, below the file strcture, you'll find the Readme of this project. This is defined in the README.md file at the root of the repository." +msgstr "" + +msgid "UserOnboardingTour|Welcome to the project overview of the %{emphasisStart}%{projectName}%{emphasisEnd} project. This is the project that we uese to work on GitLab. At first, a project seems like a simple repository, but at GitLab, a project is so much more.%{lineBreak}%{lineBreak}You can create projects for hosting your codebase, use it as an issue tracker, collaboreate on code, and continuously build, test, and deploy your app with built-in GitLab CI/CD." +msgstr "" + msgid "UserProfile|Activity" msgstr "" @@ -12904,12 +17105,18 @@ msgstr "" msgid "Users" msgstr "" +msgid "Users outside of license" +msgstr "" + msgid "Users requesting access to" msgstr "" msgid "Users were successfully added." msgstr "" +msgid "Users with a Guest role or those who don't belong to any projects or groups don't count towards seats in use." +msgstr "" + msgid "UsersSelect|%{name} + %{length} more" msgstr "" @@ -12925,6 +17132,9 @@ msgstr "" msgid "UsersSelect|Unassigned" msgstr "" +msgid "Using %{code_start}::%{code_end} denotes a %{link_start}scoped label set%{link_end}" +msgstr "" + msgid "Using required encryption strategy when encrypted field is missing!" msgstr "" @@ -12937,6 +17147,9 @@ msgstr "" msgid "Validations failed." msgstr "" +msgid "Validity" +msgstr "" + msgid "Value" msgstr "" @@ -12955,6 +17168,9 @@ msgstr "" msgid "Various settings that affect GitLab performance." msgstr "" +msgid "Verification information" +msgstr "" + msgid "Verification status" msgstr "" @@ -12964,9 +17180,15 @@ msgstr "" msgid "Version" msgstr "" +msgid "Very helpful" +msgstr "" + msgid "View app" msgstr "" +msgid "View dependency details for your project" +msgstr "" + msgid "View deployment" msgstr "" @@ -12976,6 +17198,12 @@ msgstr "" msgid "View documentation" msgstr "" +msgid "View eligible approvers" +msgstr "" + +msgid "View epics list" +msgstr "" + msgid "View file @ " msgstr "" @@ -12991,6 +17219,9 @@ msgstr "" msgid "View it on GitLab" msgstr "" +msgid "View job" +msgstr "" + msgid "View job trace" msgstr "" @@ -13051,6 +17282,90 @@ msgstr "" msgid "VisibilityLevel|Unknown" msgstr "" +msgid "VisualReviewApp|%{stepStart}Step 1%{stepEnd}. Copy the following script:" +msgstr "" + +msgid "VisualReviewApp|%{stepStart}Step 2%{stepEnd}. Add it to the %{headTags} tags of every page of your application, ensuring the merge request ID is set or not set as required. " +msgstr "" + +msgid "VisualReviewApp|%{stepStart}Step 3%{stepEnd}. Open the Review App and provide a %{linkStart}personal access token%{linkEnd}." +msgstr "" + +msgid "VisualReviewApp|%{stepStart}Step 4%{stepEnd}. If not previously %{linkStart}configured%{linkEnd} by a developer, enter the merge request ID for the review when prompted. The ID of this merge request is %{stepStart}%{mrId}%{stepStart}." +msgstr "" + +msgid "VisualReviewApp|%{stepStart}Step 5%{stepEnd}. Leave feedback in the Review App." +msgstr "" + +msgid "VisualReviewApp|Copy merge request ID to clipboard" +msgstr "" + +msgid "VisualReviewApp|Copy script to clipboard" +msgstr "" + +msgid "VisualReviewApp|Enable Visual Reviews" +msgstr "" + +msgid "VisualReviewApp|Follow the steps below to enable Visual Reviews inside your application." +msgstr "" + +msgid "VisualReviewApp|Open review app" +msgstr "" + +msgid "VisualReviewApp|Review" +msgstr "" + +msgid "VisualReviewApp|Steps 1 and 2 (and sometimes 3) are performed once by the developer before requesting feedback. Steps 3 (if necessary), 4, and 5 are performed by the reviewer each time they perform a review." +msgstr "" + +msgid "Vulnerabilities" +msgstr "" + +msgid "Vulnerabilities over time" +msgstr "" + +msgid "Vulnerability-Check requires one or more merge request approvals only if high or critical security vulnerabilities are detected." +msgstr "" + +msgid "VulnerabilityChart|%{formattedStartDate} to today" +msgstr "" + +msgid "Vulnerability|Class" +msgstr "" + +msgid "Vulnerability|Confidence" +msgstr "" + +msgid "Vulnerability|Description" +msgstr "" + +msgid "Vulnerability|File" +msgstr "" + +msgid "Vulnerability|Identifiers" +msgstr "" + +msgid "Vulnerability|Image" +msgstr "" + +msgid "Vulnerability|Instances" +msgstr "" + +msgid "Vulnerability|Links" +msgstr "" + +msgid "Vulnerability|Namespace" +msgstr "" + +msgid "Vulnerability|Project" +msgstr "" + +msgid "Vulnerability|Report Type" +msgstr "" + +msgid "Vulnerability|Severity" +msgstr "" + msgid "Wait for the source to load to copy it to the clipboard" msgstr "" @@ -13060,9 +17375,24 @@ msgstr "" msgid "Want to see the data? Please ask an administrator for access." msgstr "" +msgid "We can't find an epic that matches what you are looking for." +msgstr "" + +msgid "We can't find an issue that matches what you are looking for." +msgstr "" + +msgid "We could not determine the path to remove the epic" +msgstr "" + +msgid "We could not determine the path to remove the issue" +msgstr "" + msgid "We couldn't find any results matching" msgstr "" +msgid "We created a short guided tour that will help you learn the basics of GitLab and how it will help you be better at your job. It should only take a couple of minutes. You will be guided by two types of helpers, best recognized by their color." +msgstr "" + msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed." msgstr "" @@ -13081,6 +17411,9 @@ msgstr "" msgid "Web IDE" msgstr "" +msgid "Web Terminal" +msgstr "" + msgid "Web terminal" msgstr "" @@ -13090,9 +17423,24 @@ msgstr "" msgid "Webhooks Help" 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 "Wednesday" msgstr "" +msgid "Weeks" +msgstr "" + +msgid "Weight" +msgstr "" + +msgid "Weight %{weight}" +msgstr "" + +msgid "Welcome to the Guided GitLab Tour" +msgstr "" + msgid "Welcome to your Issue Board!" msgstr "" @@ -13119,6 +17467,9 @@ msgstr "" msgid "When:" msgstr "" +msgid "White helpers give contextual information." +msgstr "" + msgid "Whitelist to allow requests to the local network from hooks and services" msgstr "" @@ -13272,6 +17623,9 @@ msgstr "" msgid "Will deploy to" 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 "" @@ -13284,6 +17638,9 @@ msgstr "" msgid "Write a comment or drag your files here…" msgstr "" +msgid "Write a comment…" +msgstr "" + msgid "Write access allowed" msgstr "" @@ -13377,6 +17734,9 @@ msgstr "" msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}" msgstr "" +msgid "You can filter by \"days to merge\" by clicking on the columns in the chart." +msgstr "" + msgid "You can invite a new member to <strong>%{project_name}</strong> or invite another group." msgstr "" @@ -13437,6 +17797,9 @@ msgstr "" msgid "You cannot play this scheduled pipeline at the moment. Please wait a minute." 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 "" @@ -13449,6 +17812,12 @@ msgstr "" msgid "You do not have permission to leave this %{namespaceType}." msgstr "" +msgid "You do not have permission to run the Web Terminal. Please contact a project administrator." +msgstr "" + +msgid "You do not have the correct permissions to override the settings from the LDAP group sync." +msgstr "" + msgid "You don't have any U2F devices registered yet." msgstr "" @@ -13464,9 +17833,15 @@ msgstr "" msgid "You don't have any deployments right now." msgstr "" +msgid "You don't have any projects available." +msgstr "" + msgid "You don't have any recent searches" msgstr "" +msgid "You don’t have acces to Productivity Analaytics in this group" +msgstr "" + msgid "You have been granted %{access_level} access to the %{source_link} %{source_type}." msgstr "" @@ -13485,6 +17860,9 @@ msgstr "" msgid "You have no permissions" msgstr "" +msgid "You have not added any approvers. Start by adding users or groups." +msgstr "" + msgid "You have reached your project limit" msgstr "" @@ -13515,6 +17893,15 @@ msgstr "" msgid "You must provide your current password in order to change it." msgstr "" +msgid "You need a different license to enable FileLocks feature" +msgstr "" + +msgid "You need a different license to use Geo replication." +msgstr "" + +msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com" +msgstr "" + msgid "You need permission." msgstr "" @@ -13569,6 +17956,9 @@ 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 be signed out from your current account automatically." +msgstr "" + msgid "You'll need to use different branch names to get a valid comparison." msgstr "" @@ -13698,6 +18088,9 @@ msgstr "" msgid "Your name" msgstr "" +msgid "Your new SCIM token" +msgstr "" + msgid "Your new personal access token has been created." msgstr "" @@ -13761,12 +18154,290 @@ msgstr "" msgid "cannot be enabled unless all domains have TLS certificates" msgstr "" +msgid "cannot be in the same project" +msgstr "" + +msgid "cannot be modified" +msgstr "" + +msgid "cannot block others" +msgstr "" + msgid "cannot include leading slash or directory traversal." msgstr "" +msgid "cannot itself be blocked" +msgstr "" + msgid "cannot merge" msgstr "" +msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}" +msgstr "" + +msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}" +msgstr "" + +msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}" +msgstr "" + +msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}" +msgstr "" + +msgid "ciReport|%{namespace} is affected by %{vulnerability}." +msgstr "" + +msgid "ciReport|%{remainingPackagesCount} more" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{dismissedCount} dismissed vulnerability" +msgid_plural "ciReport|%{reportType} %{status} detected %{dismissedCount} dismissed vulnerabilities" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} %{status} detected %{dismissedCount} dismissed vulnerability for the source branch only" +msgid_plural "ciReport|%{reportType} %{status} detected %{dismissedCount} dismissed vulnerabilities for the source branch only" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerability" +msgid_plural "ciReport|%{reportType} %{status} detected %{fixedCount} fixed vulnerabilities" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} %{status} detected %{fixedCount} fixed, and %{dismissedCount} dismissed vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} new vulnerability" +msgid_plural "ciReport|%{reportType} %{status} detected %{newCount} new vulnerabilities" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} new, %{fixedCount} fixed, and %{dismissedCount} dismissed vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} new, and %{dismissedCount} dismissed vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} new, and %{dismissedCount} dismissed vulnerabilities for the source branch only" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} new, and %{fixedCount} fixed vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected %{newCount} vulnerability for the source branch only" +msgid_plural "ciReport|%{reportType} %{status} detected %{newCount} vulnerabilities for the source branch only" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} %{status} detected no new vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected no vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} %{status} detected no vulnerabilities for the source branch only" +msgstr "" + +msgid "ciReport|%{reportType} detected %{vulnerabilityCount} vulnerability" +msgid_plural "ciReport|%{reportType} detected %{vulnerabilityCount} vulnerabilities" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|%{reportType} detected no vulnerabilities" +msgstr "" + +msgid "ciReport|%{reportType} is loading" +msgstr "" + +msgid "ciReport|%{reportType}: Loading resulted in an error" +msgstr "" + +msgid "ciReport|%{vulnerability} in %{featurename}" +msgstr "" + +msgid "ciReport|(errors when loading results)" +msgstr "" + +msgid "ciReport|(is loading)" +msgstr "" + +msgid "ciReport|(is loading, errors when loading results)" +msgstr "" + +msgid "ciReport|All confidence levels" +msgstr "" + +msgid "ciReport|All projects" +msgstr "" + +msgid "ciReport|All report types" +msgstr "" + +msgid "ciReport|All severities" +msgstr "" + +msgid "ciReport|Automatically apply the patch in a new branch" +msgstr "" + +msgid "ciReport|Class" +msgstr "" + +msgid "ciReport|Code quality" +msgstr "" + +msgid "ciReport|Confidence" +msgstr "" + +msgid "ciReport|Container Scanning" +msgstr "" + +msgid "ciReport|Container scanning" +msgstr "" + +msgid "ciReport|Container scanning detects known vulnerabilities in your docker images." +msgstr "" + +msgid "ciReport|Create a merge request to implement this solution, or download and apply the patch manually." +msgstr "" + +msgid "ciReport|Create issue" +msgstr "" + +msgid "ciReport|DAST" +msgstr "" + +msgid "ciReport|Dependency Scanning" +msgstr "" + +msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code's dependencies." +msgstr "" + +msgid "ciReport|Dependency scanning" +msgstr "" + +msgid "ciReport|Description" +msgstr "" + +msgid "ciReport|Download patch to resolve" +msgstr "" + +msgid "ciReport|Download the patch to apply it manually" +msgstr "" + +msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application." +msgstr "" + +msgid "ciReport|Failed to load %{reportName} report" +msgstr "" + +msgid "ciReport|File" +msgstr "" + +msgid "ciReport|Fixed:" +msgstr "" + +msgid "ciReport|Identifiers" +msgstr "" + +msgid "ciReport|Image" +msgstr "" + +msgid "ciReport|Instances" +msgstr "" + +msgid "ciReport|Investigate this vulnerability by creating an issue" +msgstr "" + +msgid "ciReport|Learn more about interacting with security reports" +msgstr "" + +msgid "ciReport|Links" +msgstr "" + +msgid "ciReport|Loading %{reportName} report" +msgstr "" + +msgid "ciReport|Manage licenses" +msgstr "" + +msgid "ciReport|Method" +msgstr "" + +msgid "ciReport|Namespace" +msgstr "" + +msgid "ciReport|No changes to code quality" +msgstr "" + +msgid "ciReport|No changes to performance metrics" +msgstr "" + +msgid "ciReport|Performance metrics" +msgstr "" + +msgid "ciReport|Resolve with merge request" +msgstr "" + +msgid "ciReport|SAST" +msgstr "" + +msgid "ciReport|Security scanning" +msgstr "" + +msgid "ciReport|Security scanning failed loading any results" +msgstr "" + +msgid "ciReport|Severity" +msgstr "" + +msgid "ciReport|Solution" +msgstr "" + +msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code." +msgstr "" + +msgid "ciReport|There was an error creating the issue. Please try again." +msgstr "" + +msgid "ciReport|There was an error creating the merge request. Please try again." +msgstr "" + +msgid "ciReport|There was an error dismissing the vulnerability. Please try again." +msgstr "" + +msgid "ciReport|There was an error loading DAST report" +msgstr "" + +msgid "ciReport|There was an error loading SAST report" +msgstr "" + +msgid "ciReport|There was an error loading container scanning report" +msgstr "" + +msgid "ciReport|There was an error loading dependency scanning report" +msgstr "" + +msgid "ciReport|There was an error reverting the dismissal. Please try again." +msgstr "" + +msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}." +msgstr "" + +msgid "ciReport|Upgrade %{name} to %{fixed}." +msgstr "" + +msgid "ciReport|Upgrade to %{fixed}." +msgstr "" + +msgid "ciReport|Used by %{packagesString}" +msgid_plural "ciReport|Used by %{packagesString}, and %{lastPackage}" +msgstr[0] "" +msgstr[1] "" + +msgid "ciReport|View full report" +msgstr "" + msgid "comment" msgstr "" @@ -13776,6 +18447,30 @@ msgstr "" msgid "commit %{commit_id}" msgstr "" +msgid "confidence|Confirmed" +msgstr "" + +msgid "confidence|Experimental" +msgstr "" + +msgid "confidence|High" +msgstr "" + +msgid "confidence|Ignore" +msgstr "" + +msgid "confidence|Low" +msgstr "" + +msgid "confidence|Medium" +msgstr "" + +msgid "confidence|Undefined" +msgstr "" + +msgid "confidence|Unknown" +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 "" @@ -13805,6 +18500,12 @@ msgstr[1] "" msgid "deleted" msgstr "" +msgid "deploy" +msgstr "" + +msgid "design" +msgstr "" + msgid "detached" msgstr "" @@ -13814,12 +18515,20 @@ msgstr "" msgid "done" msgstr "" +msgid "draft" +msgid_plural "drafts" +msgstr[0] "" +msgstr[1] "" + msgid "e.g. %{token}" msgstr "" msgid "element is not a hierarchy" msgstr "" +msgid "email '%{email}' does not match the allowed domain of '%{email_domain}'" +msgstr "" + msgid "enabled" msgstr "" @@ -13835,6 +18544,9 @@ msgstr "" msgid "entries cannot contain HTML tags" msgstr "" +msgid "epic" +msgstr "" + msgid "error" msgstr "" @@ -13877,6 +18589,9 @@ msgstr "" msgid "has already been taken" msgstr "" +msgid "help" +msgstr "" + msgid "here" msgstr "" @@ -13901,9 +18616,29 @@ msgstr "" msgid "index" msgstr "" +msgid "instance completed" +msgid_plural "instances completed" +msgstr[0] "" +msgstr[1] "" + msgid "invalid milestone state `%{state}`" msgstr "" +msgid "is an invalid IP address range" +msgstr "" + +msgid "is enabled." +msgstr "" + +msgid "is invalid because there is downstream lock" +msgstr "" + +msgid "is invalid because there is upstream lock" +msgstr "" + +msgid "is not a descendant of the Group owning the template" +msgstr "" + msgid "is not a valid X509 certificate." msgstr "" @@ -13940,6 +18675,12 @@ msgstr "" msgid "leave %{group_name}" msgstr "" +msgid "locked by %{path_lock_user_name} %{created_at}" +msgstr "" + +msgid "log in" +msgstr "" + msgid "manual" msgstr "" @@ -13949,6 +18690,9 @@ msgstr "" msgid "math|There was an error rendering this math block" msgstr "" +msgid "may expose confidential information" +msgstr "" + msgid "merge request" msgid_plural "merge requests" msgstr[0] "" @@ -13993,9 +18737,36 @@ msgstr "" msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB" msgstr "" +msgid "mrWidget|Added to the merge train at position %{mergeTrainPosition}" +msgstr "" + +msgid "mrWidget|Added to the merge train by" +msgstr "" + msgid "mrWidget|Allows commits from members who can merge to the target branch" msgstr "" +msgid "mrWidget|An error occurred while removing your approval." +msgstr "" + +msgid "mrWidget|An error occurred while retrieving approval data for this merge request." +msgstr "" + +msgid "mrWidget|An error occurred while submitting your approval." +msgstr "" + +msgid "mrWidget|Approval password is invalid." +msgstr "" + +msgid "mrWidget|Approve" +msgstr "" + +msgid "mrWidget|Approve additionally" +msgstr "" + +msgid "mrWidget|Approved by" +msgstr "" + msgid "mrWidget|Cancel automatic merge" msgstr "" @@ -14068,9 +18839,21 @@ msgstr "" msgid "mrWidget|Merge locally" msgstr "" +msgid "mrWidget|Merge request approved." +msgstr "" + msgid "mrWidget|Merged by" msgstr "" +msgid "mrWidget|More information" +msgstr "" + +msgid "mrWidget|No approval required" +msgstr "" + +msgid "mrWidget|No approval required; you can still approve" +msgstr "" + msgid "mrWidget|Open in Web IDE" msgstr "" @@ -14092,6 +18875,9 @@ msgstr "" msgid "mrWidget|Refreshing now" msgstr "" +msgid "mrWidget|Remove from merge train" +msgstr "" + msgid "mrWidget|Request to merge" msgstr "" @@ -14110,6 +18896,9 @@ msgstr "" msgid "mrWidget|Revert this merge request in a new merge request" msgstr "" +msgid "mrWidget|Revoke approval" +msgstr "" + msgid "mrWidget|Set by" msgstr "" @@ -14158,9 +18947,18 @@ msgstr "" msgid "mrWidget|This merge request is in the process of being merged" msgstr "" +msgid "mrWidget|This merge request will be added to the merge train when pipeline %{linkStart}#%{pipelineId}%{linkEnd} succeeds." +msgstr "" + +msgid "mrWidget|This merge request will start a merge train when pipeline %{linkStart}#%{pipelineId}%{linkEnd} succeeds." +msgstr "" + msgid "mrWidget|This project is archived, write access has been disabled" msgstr "" +msgid "mrWidget|To approve this merge request, please enter your password. This project requires all approvals to be authenticated." +msgstr "" + msgid "mrWidget|When this merge request is ready, remove the WIP: prefix from the title to allow it to be merged" msgstr "" @@ -14173,6 +18971,9 @@ msgstr "" msgid "mrWidget|You can merge this merge request manually using the" msgstr "" +msgid "mrWidget|Your password" +msgstr "" + msgid "mrWidget|branch does not exist." msgstr "" @@ -14182,9 +18983,15 @@ msgstr "" msgid "mrWidget|into" msgstr "" +msgid "mrWidget|to be added to the merge train when the pipeline succeeds" +msgstr "" + msgid "mrWidget|to be merged automatically when the pipeline succeeds" msgstr "" +msgid "mrWidget|to start a merge train when the pipeline succeeds" +msgstr "" + msgid "must be greater than start date" msgstr "" @@ -14243,6 +19050,11 @@ msgstr "" msgid "pipeline" msgstr "" +msgid "point" +msgid_plural "points" +msgstr[0] "" +msgstr[1] "" + msgid "private" msgstr "" @@ -14253,7 +19065,9 @@ msgid "processing" msgstr "" msgid "project" -msgstr "" +msgid_plural "projects" +msgstr[0] "" +msgstr[1] "" msgid "project avatar" msgstr "" @@ -14276,6 +19090,9 @@ msgstr "" msgid "remove due date" msgstr "" +msgid "remove weight" +msgstr "" + msgid "removed a Zoom call from this issue" msgstr "" @@ -14287,9 +19104,36 @@ msgid_plural "replies" msgstr[0] "" msgstr[1] "" +msgid "reset it." +msgstr "" + msgid "score" msgstr "" +msgid "security Reports|There was an error creating the merge request" +msgstr "" + +msgid "severity|Critical" +msgstr "" + +msgid "severity|High" +msgstr "" + +msgid "severity|Info" +msgstr "" + +msgid "severity|Low" +msgstr "" + +msgid "severity|Medium" +msgstr "" + +msgid "severity|Undefined" +msgstr "" + +msgid "severity|Unknown" +msgstr "" + msgid "should be greater than or equal to %{access} inherited membership from group %{group_name}" msgstr "" @@ -14343,6 +19187,9 @@ msgid_plural "threads resolved" msgstr[0] "" msgstr[1] "" +msgid "to help your contributors communicate effectively!" +msgstr "" + msgid "to list" msgstr "" @@ -14391,6 +19238,27 @@ msgstr "" msgid "view the blob" msgstr "" +msgid "vulnerability|Add a comment or reason for dismissal" +msgstr "" + +msgid "vulnerability|Add comment" +msgstr "" + +msgid "vulnerability|Add comment & dismiss" +msgstr "" + +msgid "vulnerability|Dismiss vulnerability" +msgstr "" + +msgid "vulnerability|Save comment" +msgstr "" + +msgid "vulnerability|Undo dismiss" +msgstr "" + +msgid "vulnerability|dismissed" +msgstr "" + msgid "with %{additions} additions, %{deletions} deletions." msgstr "" diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po index cfa68fccd1e..1bd39aed392 100644 --- a/locale/gl_ES/gitlab.po +++ b/locale/gl_ES/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: gl\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:02\n" +"PO-Revision-Date: 2019-06-18 11:46\n" msgid " Please sign in." msgstr "" diff --git a/locale/he_IL/gitlab.po b/locale/he_IL/gitlab.po index 7e76e201e2b..fa4ec9bf9bb 100644 --- a/locale/he_IL/gitlab.po +++ b/locale/he_IL/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: he\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:01\n" +"PO-Revision-Date: 2019-06-18 11:41\n" msgid " Please sign in." msgstr "" diff --git a/locale/hi_IN/gitlab.po b/locale/hi_IN/gitlab.po index c7f261878b2..1b541aede3e 100644 --- a/locale/hi_IN/gitlab.po +++ b/locale/hi_IN/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: hi\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:58\n" +"PO-Revision-Date: 2019-06-18 11:37\n" msgid " Please sign in." msgstr "" diff --git a/locale/hr_HR/gitlab.po b/locale/hr_HR/gitlab.po index cac5c0a35cd..3be78e24bf7 100644 --- a/locale/hr_HR/gitlab.po +++ b/locale/hr_HR/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: hr\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:00\n" +"PO-Revision-Date: 2019-06-18 11:44\n" msgid " Please sign in." msgstr "" diff --git a/locale/hu_HU/gitlab.po b/locale/hu_HU/gitlab.po index 4ae0ab94c31..ee21fbf590b 100644 --- a/locale/hu_HU/gitlab.po +++ b/locale/hu_HU/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: hu\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:54\n" +"PO-Revision-Date: 2019-06-18 11:41\n" msgid " Please sign in." msgstr "" diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po index 12578ba567c..ff8c1eb3391 100644 --- a/locale/id_ID/gitlab.po +++ b/locale/id_ID/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: id\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:57\n" +"PO-Revision-Date: 2019-06-18 11:35\n" msgid " Please sign in." msgstr "" diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po index 26d2a6c9be7..454eb1aaa6e 100644 --- a/locale/it/gitlab.po +++ b/locale/it/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: it\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:52\n" +"PO-Revision-Date: 2019-06-18 11:35\n" msgid " Please sign in." msgstr " Per favore effettua il login." diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po index 8a05c69ca85..e5b890b16de 100644 --- a/locale/ja/gitlab.po +++ b/locale/ja/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ja\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:52\n" +"PO-Revision-Date: 2019-06-18 11:35\n" msgid " Please sign in." msgstr " サインインしてください。" diff --git a/locale/ka_GE/gitlab.po b/locale/ka_GE/gitlab.po index 202f4a1ce28..fd0c5e4f39d 100644 --- a/locale/ka_GE/gitlab.po +++ b/locale/ka_GE/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ka\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:03\n" +"PO-Revision-Date: 2019-06-18 11:47\n" msgid " Please sign in." msgstr "" diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po index 955221059f3..c08fd6ac89a 100644 --- a/locale/ko/gitlab.po +++ b/locale/ko/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ko\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:52\n" +"PO-Revision-Date: 2019-06-18 11:36\n" msgid " Please sign in." msgstr " 로그인 해주세요." diff --git a/locale/mn_MN/gitlab.po b/locale/mn_MN/gitlab.po index 12cad4d8ba7..ddb493387b9 100644 --- a/locale/mn_MN/gitlab.po +++ b/locale/mn_MN/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: mn\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:53\n" +"PO-Revision-Date: 2019-06-18 11:36\n" msgid " Please sign in." msgstr "" diff --git a/locale/nb_NO/gitlab.po b/locale/nb_NO/gitlab.po index 8cac58c66bd..67198f50aed 100644 --- a/locale/nb_NO/gitlab.po +++ b/locale/nb_NO/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: nb\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:53\n" +"PO-Revision-Date: 2019-06-18 11:36\n" msgid " Please sign in." msgstr "" diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po index 24f3c7d8527..705a1a74fcc 100644 --- a/locale/nl_NL/gitlab.po +++ b/locale/nl_NL/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: nl\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:01\n" +"PO-Revision-Date: 2019-06-18 11:45\n" msgid " Please sign in." msgstr "" diff --git a/locale/pa_IN/gitlab.po b/locale/pa_IN/gitlab.po index 7120181643f..5d8b144bbb7 100644 --- a/locale/pa_IN/gitlab.po +++ b/locale/pa_IN/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: pa-IN\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:52\n" +"PO-Revision-Date: 2019-06-18 11:34\n" msgid " Please sign in." msgstr "" diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po index a8ab402925b..8345eb5ee58 100644 --- a/locale/pl_PL/gitlab.po +++ b/locale/pl_PL/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: pl\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:53\n" +"PO-Revision-Date: 2019-06-18 11:37\n" msgid " Please sign in." msgstr "" diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po index 750b4987ed3..3be12b6797a 100644 --- a/locale/pt_BR/gitlab.po +++ b/locale/pt_BR/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: pt-BR\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:54\n" +"PO-Revision-Date: 2019-06-18 11:37\n" msgid " Please sign in." msgstr " Por favor, entre usando sua conta." @@ -6413,7 +6413,7 @@ msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab ad msgstr "Autenticação do Google não está %{link_to_documentation}. Peça ao administrador do Gitlab se você deseja usar esse serviço." msgid "Got it" -msgstr "" +msgstr "Entendi" msgid "Got it!" msgstr "Entendi!" @@ -8260,7 +8260,7 @@ msgid "MergeRequest| %{paragraphStart}changed the description %{descriptionChang msgstr "%{paragraphStart}alterou a descrição %{descriptionChangedTimes} vezes %{timeDifferenceMinutes}%{paragraphEnd}" msgid "MergeRequest|Error dismissing suggestion popover. Please try again." -msgstr "" +msgstr "Erro ao dispensar popover de sugestão. Por favor, tente novamente." msgid "MergeRequest|Error loading full diff. Please try again." msgstr "Erro ao carregar o diff completo. Por favor, tente novamente." @@ -8739,7 +8739,7 @@ msgid "New users set to external" msgstr "" msgid "New! Suggest changes directly" -msgstr "" +msgstr "Novo! Sugira alterações diretamente" msgid "New..." msgstr "Novo..." @@ -9281,16 +9281,16 @@ msgid "Pages getting started guide" msgstr "Guia de primeiros passos a Páginas" msgid "Pagination|Go to first page" -msgstr "" +msgstr "Ir para primeira página" msgid "Pagination|Go to last page" -msgstr "" +msgstr "Ir para a última página" msgid "Pagination|Go to next page" -msgstr "" +msgstr "Ir para a próxima página" msgid "Pagination|Go to previous page" -msgstr "" +msgstr "Ir para a página anterior" msgid "Pagination|Last »" msgstr "Último >>" @@ -12780,7 +12780,7 @@ msgid "Successfully unlocked" msgstr "" msgid "Suggest code changes which are immediately applied. Try it out!" -msgstr "" +msgstr "Sugira alterações de código que são aplicadas imediatamente. Experimente!" msgid "Suggested change" msgstr "" diff --git a/locale/pt_PT/gitlab.po b/locale/pt_PT/gitlab.po index 57cb6132b5f..9a2ec349594 100644 --- a/locale/pt_PT/gitlab.po +++ b/locale/pt_PT/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: pt-PT\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:54\n" +"PO-Revision-Date: 2019-06-18 11:24\n" msgid " Please sign in." msgstr " Por favor, inicia a sessão." diff --git a/locale/ro_RO/gitlab.po b/locale/ro_RO/gitlab.po index f3f04dd449b..7974362f44c 100644 --- a/locale/ro_RO/gitlab.po +++ b/locale/ro_RO/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ro\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:54\n" +"PO-Revision-Date: 2019-06-18 11:37\n" msgid " Please sign in." msgstr "" diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po index 2ca9e319998..517bb388e1e 100644 --- a/locale/ru/gitlab.po +++ b/locale/ru/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: ru\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:55\n" +"PO-Revision-Date: 2019-06-18 11:38\n" msgid " Please sign in." msgstr "" diff --git a/locale/sk_SK/gitlab.po b/locale/sk_SK/gitlab.po index 68e64991e06..dc6c5a07e96 100644 --- a/locale/sk_SK/gitlab.po +++ b/locale/sk_SK/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sk\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:56\n" +"PO-Revision-Date: 2019-06-18 11:39\n" msgid " Please sign in." msgstr "" diff --git a/locale/sq_AL/gitlab.po b/locale/sq_AL/gitlab.po index 436c7e6034f..a626a9512e1 100644 --- a/locale/sq_AL/gitlab.po +++ b/locale/sq_AL/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sq\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:51\n" +"PO-Revision-Date: 2019-06-18 11:42\n" msgid " Please sign in." msgstr "" diff --git a/locale/sr_CS/gitlab.po b/locale/sr_CS/gitlab.po index 02ac3e67563..6494d71524e 100644 --- a/locale/sr_CS/gitlab.po +++ b/locale/sr_CS/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sr-CS\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:55\n" +"PO-Revision-Date: 2019-06-18 11:38\n" msgid " Please sign in." msgstr "" diff --git a/locale/sr_SP/gitlab.po b/locale/sr_SP/gitlab.po index 9b22d51e687..4bec374e321 100644 --- a/locale/sr_SP/gitlab.po +++ b/locale/sr_SP/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sr\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:55\n" +"PO-Revision-Date: 2019-06-18 11:38\n" msgid " Please sign in." msgstr "" diff --git a/locale/sv_SE/gitlab.po b/locale/sv_SE/gitlab.po index b39f28cda0e..46cd8870db7 100644 --- a/locale/sv_SE/gitlab.po +++ b/locale/sv_SE/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sv-SE\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:56\n" +"PO-Revision-Date: 2019-06-18 11:40\n" msgid " Please sign in." msgstr "" diff --git a/locale/sw_KE/gitlab.po b/locale/sw_KE/gitlab.po index bc2a228362c..b647040f6da 100644 --- a/locale/sw_KE/gitlab.po +++ b/locale/sw_KE/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: sw\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:56\n" +"PO-Revision-Date: 2019-06-18 11:39\n" msgid " Please sign in." msgstr "" diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po index b801b5a93f4..4022fd33d1d 100644 --- a/locale/tr_TR/gitlab.po +++ b/locale/tr_TR/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: tr\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 19:57\n" +"PO-Revision-Date: 2019-06-18 11:40\n" msgid " Please sign in." msgstr " Lütfen oturum açın." diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po index b9056ca8ae1..77337c4ea86 100644 --- a/locale/uk/gitlab.po +++ b/locale/uk/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: uk\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 21:26\n" +"PO-Revision-Date: 2019-06-18 12:05\n" msgid " Please sign in." msgstr " Будь ласка, увійдіть." @@ -6513,7 +6513,7 @@ msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab ad msgstr "Автентифікація Google не %{link_to_documentation}. Попросіть свого адміністратора GitLab, якщо ви хочете скористатися цим сервісом." msgid "Got it" -msgstr "" +msgstr "Зрозуміло" msgid "Got it!" msgstr "Зрозуміло!" @@ -7604,7 +7604,7 @@ msgid "Job|with" msgstr "" msgid "Join Zoom meeting" -msgstr "" +msgstr "Приєднатися до зустрічі в Zoom" msgid "Jul" msgstr "лип." @@ -9393,16 +9393,16 @@ msgid "Pages getting started guide" msgstr "" msgid "Pagination|Go to first page" -msgstr "" +msgstr "Перейти до першої сторінки" msgid "Pagination|Go to last page" -msgstr "" +msgstr "Перейти до останньої сторінки" msgid "Pagination|Go to next page" -msgstr "" +msgstr "Перейти до наступної сторінки" msgid "Pagination|Go to previous page" -msgstr "" +msgstr "Перейти до попередньої сторінки" msgid "Pagination|Last »" msgstr "Остання »" diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po index ba86aa74c64..ff95d89a9b2 100644 --- a/locale/zh_CN/gitlab.po +++ b/locale/zh_CN/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: zh-CN\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:00\n" +"PO-Revision-Date: 2019-06-18 11:43\n" msgid " Please sign in." msgstr " 请登录。" diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index d5ead45d34f..14b7552a46e 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: zh-HK\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:00\n" +"PO-Revision-Date: 2019-06-18 11:41\n" msgid " Please sign in." msgstr "請登入您的帳戶" diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po index 308c1cfd9fd..eb2655eddce 100644 --- a/locale/zh_TW/gitlab.po +++ b/locale/zh_TW/gitlab.po @@ -13,7 +13,7 @@ msgstr "" "X-Crowdin-Project: gitlab-ee\n" "X-Crowdin-Language: zh-TW\n" "X-Crowdin-File: /master/locale/gitlab.pot\n" -"PO-Revision-Date: 2019-06-14 20:00\n" +"PO-Revision-Date: 2019-06-18 11:44\n" msgid " Please sign in." msgstr "" @@ -162,6 +162,12 @@ module QA module Group autoload :New, 'qa/page/group/new' autoload :Show, 'qa/page/group/show' + autoload :Menu, 'qa/page/group/menu' + + module SubMenus + autoload :Common, 'qa/page/group/sub_menus/common' + autoload :Members, 'qa/page/group/sub_menus/members' + end module Settings autoload :General, 'qa/page/group/settings/general' @@ -222,6 +228,7 @@ module QA autoload :MergeRequest, 'qa/page/project/settings/merge_request' autoload :Members, 'qa/page/project/settings/members' autoload :MirroringRepositories, 'qa/page/project/settings/mirroring_repositories' + autoload :VisibilityFeaturesPermissions, 'qa/page/project/settings/visibility_features_permissions' end module SubMenus @@ -278,6 +285,7 @@ module QA autoload :Menu, 'qa/page/profile/menu' autoload :PersonalAccessTokens, 'qa/page/profile/personal_access_tokens' autoload :SSHKeys, 'qa/page/profile/ssh_keys' + autoload :TwoFactorAuth, 'qa/page/profile/two_factor_auth' end module Issuable diff --git a/qa/qa/page/group/menu.rb b/qa/qa/page/group/menu.rb new file mode 100644 index 00000000000..6353895ffd4 --- /dev/null +++ b/qa/qa/page/group/menu.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + class Menu < Page::Base + include SubMenus::Common + + view 'app/views/layouts/nav/sidebar/_group.html.haml' do + element :group_settings_item + element :group_members_item + element :general_settings_link + end + + def click_group_members_item + within_sidebar do + click_element(:group_members_item) + end + end + + def click_group_general_settings_item + hover_element(:group_settings_item) do + within_submenu(:group_sidebar_submenu) do + click_element(:general_settings_link) + end + end + end + end + end + end +end + +QA::Page::Group::Menu.prepend_if_ee('QA::EE::Page::Group::Menu') diff --git a/qa/qa/page/group/settings/general.rb b/qa/qa/page/group/settings/general.rb index 07b421f154a..efc8bbd7482 100644 --- a/qa/qa/page/group/settings/general.rb +++ b/qa/qa/page/group/settings/general.rb @@ -5,14 +5,99 @@ module QA module Group module Settings class General < QA::Page::Base + include ::QA::Page::Settings::Common + view 'app/views/groups/edit.html.haml' do element :permission_lfs_2fa_section end + view 'app/views/groups/settings/_permissions.html.haml' do element :save_permissions_changes_button end + + view 'app/views/groups/settings/_general.html.haml' do + element :group_name_field + element :save_name_visibility_settings_button + end + + view 'app/views/shared/_visibility_radios.html.haml' do + element :internal_radio, 'qa_selector: "#{visibility_level_label(level).downcase}_radio"' # rubocop:disable QA/ElementWithPattern, Lint/InterpolationCheck + end + + view 'app/views/groups/settings/_lfs.html.haml' do + element :lfs_checkbox + end + + view 'app/views/shared/_allow_request_access.html.haml' do + element :request_access_checkbox + end + + view 'app/views/groups/settings/_two_factor_auth.html.haml' do + element :require_2fa_checkbox + end + + view 'app/views/groups/settings/_project_creation_level.html.haml' do + element :project_creation_level_dropdown + end + + def set_group_name(name) + find_element(:group_name_field).send_keys([:command, 'a'], :backspace) + find_element(:group_name_field).set name + end + + def set_group_visibility(visibility) + find_element("#{visibility.downcase}_radio").click + end + + def click_save_name_visibility_settings_button + click_element(:save_name_visibility_settings_button) + end + + def set_lfs_enabled + expand_section :permission_lfs_2fa_section + check_element :lfs_checkbox + click_element :save_permissions_changes_button + end + + def set_lfs_disabled + expand_section :permission_lfs_2fa_section + uncheck_element :lfs_checkbox + click_element :save_permissions_changes_button + end + + def set_request_access_enabled + expand_section :permission_lfs_2fa_section + check_element :request_access_checkbox + click_element :save_permissions_changes_button + end + + def set_request_access_disabled + expand_section :permission_lfs_2fa_section + uncheck_element :request_access_checkbox + click_element :save_permissions_changes_button + end + + def set_require_2fa_enabled + expand_section :permission_lfs_2fa_section + check_element :require_2fa_checkbox + click_element :save_permissions_changes_button + end + + def set_require_2fa_disabled + expand_section :permission_lfs_2fa_section + uncheck_element :require_2fa_checkbox + click_element :save_permissions_changes_button + end + + def set_project_creation_level(value) + expand_section :permission_lfs_2fa_section + select_element(:project_creation_level_dropdown, value) + click_element :save_permissions_changes_button + end end end end end end + +QA::Page::Group::Settings::General.prepend_if_ee('QA::EE::Page::Group::Settings::General') diff --git a/qa/qa/page/group/sub_menus/common.rb b/qa/qa/page/group/sub_menus/common.rb new file mode 100644 index 00000000000..a378db80e4b --- /dev/null +++ b/qa/qa/page/group/sub_menus/common.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + module SubMenus + module Common + def self.included(base) + base.class_eval do + view 'app/views/layouts/nav/sidebar/_group.html.haml' do + element :group_sidebar + end + end + end + + def hover_element(element) + within_sidebar do + find_element(element).hover + yield + end + end + + def within_sidebar + within_element(:group_sidebar) do + yield + end + end + + def within_submenu(element) + within_element(element) do + yield + end + end + end + end + end + end +end diff --git a/qa/qa/page/group/sub_menus/members.rb b/qa/qa/page/group/sub_menus/members.rb new file mode 100644 index 00000000000..c8b3f5bb422 --- /dev/null +++ b/qa/qa/page/group/sub_menus/members.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module QA + module Page + module Group + module SubMenus + class Members < Page::Base + include Page::Component::UsersSelect + + view 'app/views/groups/group_members/_new_group_member.html.haml' do + element :add_to_group_button + end + + view 'app/helpers/groups/group_members_helper.rb' do + element :member_select_field + end + + view 'app/views/shared/members/_member.html.haml' do + element :member_row + element :access_level_dropdown + element :delete_member_button + element :developer_access_level_link, 'qa_selector: "#{role.downcase}_access_level_link"' # rubocop:disable QA/ElementWithPattern, Lint/InterpolationCheck + end + + def add_member(username) + select_user :member_select_field, username + click_element :add_to_group_button + end + + def update_access_level(username, access_level) + within_element(:member_row, text: username) do + click_element :access_level_dropdown + click_element "#{access_level.downcase}_access_level_link" + end + end + + def remove_member(username) + page.accept_confirm do + within_element(:member_row, text: username) do + click_element :delete_member_button + end + end + end + end + end + end + end +end diff --git a/qa/qa/page/profile/two_factor_auth.rb b/qa/qa/page/profile/two_factor_auth.rb new file mode 100644 index 00000000000..a3ff5f603fa --- /dev/null +++ b/qa/qa/page/profile/two_factor_auth.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module QA + module Page + module Profile + class TwoFactorAuth < Page::Base + view 'app/assets/javascripts/pages/profiles/two_factor_auths/index.js' do + element :configure_it_later_button + end + + def click_configure_it_later_button + click_element :configure_it_later_button + end + end + end + end +end diff --git a/qa/qa/page/project/menu.rb b/qa/qa/page/project/menu.rb index a9226927741..5967213a52b 100644 --- a/qa/qa/page/project/menu.rb +++ b/qa/qa/page/project/menu.rb @@ -40,4 +40,4 @@ module QA end end -QA::Page::Project::Menu.prepend_if_ee('QA::EE::Page::Project::SubMenus::SecurityCompliance') +QA::Page::Project::Menu.prepend_if_ee('QA::EE::Page::Project::Menu') diff --git a/qa/qa/page/project/settings/advanced.rb b/qa/qa/page/project/settings/advanced.rb index ab4e3d757b6..3a5067a9541 100644 --- a/qa/qa/page/project/settings/advanced.rb +++ b/qa/qa/page/project/settings/advanced.rb @@ -12,6 +12,13 @@ module QA element :project_path_field element :change_path_button element :transfer_button + element :archive_project_link + element :unarchive_project_link + end + + view 'app/views/projects/_export.html.haml' do + element :export_project_link + element :download_export_link end def update_project_path_to(path) @@ -38,6 +45,26 @@ module QA fill_confirmation_text(project_name) click_confirm_button end + + def click_export_project_link + click_element :export_project_link + end + + def click_download_export_link + click_element :download_export_link + end + + def archive_project + page.accept_alert("Are you sure that you want to archive this project?") do + click_element :archive_project_link + end + end + + def unarchive_project + page.accept_alert("Are you sure that you want to unarchive this project?") do + click_element :unarchive_project_link + end + end end end end diff --git a/qa/qa/page/project/settings/main.rb b/qa/qa/page/project/settings/main.rb index a196fc0123a..6b26c82a46f 100644 --- a/qa/qa/page/project/settings/main.rb +++ b/qa/qa/page/project/settings/main.rb @@ -18,6 +18,10 @@ module QA element :save_naming_topics_avatar_button end + view 'app/views/projects/edit.html.haml' do + element :visibility_features_permissions_content + end + def rename_project_to(name) fill_project_name(name) click_save_changes @@ -36,6 +40,12 @@ module QA Advanced.perform(&block) end end + + def expand_visibility_project_features_permissions(&block) + expand_section(:visibility_features_permissions_content) do + VisibilityFeaturesPermissions.perform(&block) + end + end end end end diff --git a/qa/qa/page/project/settings/members.rb b/qa/qa/page/project/settings/members.rb index 7fed93ca83f..2ef018fd983 100644 --- a/qa/qa/page/project/settings/members.rb +++ b/qa/qa/page/project/settings/members.rb @@ -6,6 +6,7 @@ module QA module Settings class Members < Page::Base include Page::Component::UsersSelect + include QA::Page::Component::Select2 view 'app/views/projects/project_members/_new_project_member.html.haml' do element :member_select_input @@ -16,10 +17,44 @@ module QA element :members_list end + view 'app/views/projects/project_members/index.html.haml' do + element :invite_group_tab + end + + view 'app/views/projects/project_members/_new_project_group.html.haml' do + element :group_select_field + element :invite_group_button + end + + view 'app/views/shared/members/_group.html.haml' do + element :group_row + element :delete_group_access_link + end + + def select_group(group_name) + click_element :group_select_field + search_and_select(group_name) + end + + def invite_group(group_name) + click_element :invite_group_tab + select_group(group_name) + click_element :invite_group_button + end + def add_member(username) select_user :member_select_input, username click_element :add_member_button end + + def remove_group(group_name) + click_element :invite_group_tab + page.accept_alert do + within_element(:group_row, text: group_name) do + click_element :delete_group_access_link + end + end + end end end end diff --git a/qa/qa/page/project/settings/visibility_features_permissions.rb b/qa/qa/page/project/settings/visibility_features_permissions.rb new file mode 100644 index 00000000000..1d6686ae360 --- /dev/null +++ b/qa/qa/page/project/settings/visibility_features_permissions.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Settings + class VisibilityFeaturesPermissions < Page::Base + include QA::Page::Component::Select2 + + view 'app/views/projects/edit.html.haml' do + element :visibility_features_permissions_save_button + end + + view 'app/assets/javascripts/pages/projects/shared/permissions/components/settings_panel.vue' do + element :project_visibility_dropdown + end + + def set_project_visibility(visibility) + select_element(:project_visibility_dropdown, visibility) + click_element :visibility_features_permissions_save_button + end + end + end + end + end +end diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb index 549992f271b..102b6144a1e 100644 --- a/qa/qa/page/project/show.rb +++ b/qa/qa/page/project/show.rb @@ -56,6 +56,10 @@ module QA element :spinner end + view 'app/views/projects/buttons/_download.html.haml' do + element :download_source_code_button + end + def wait_for_viewers_to_load wait(reload: false) do has_no_element?(:spinner) diff --git a/qa/qa/runtime/feature.rb b/qa/qa/runtime/feature.rb index 1b4ae7adbbe..b74f343ba7b 100644 --- a/qa/qa/runtime/feature.rb +++ b/qa/qa/runtime/feature.rb @@ -18,6 +18,11 @@ module QA set_feature(key, false) end + def enabled?(key) + feature = JSON.parse(get_features).find { |flag| flag["name"] == key } + feature && feature["state"] == "on" + end + private def api_client @@ -31,6 +36,12 @@ module QA raise SetFeatureError, "Setting feature flag #{key} to #{value} failed with `#{response}`." end end + + def get_features + request = Runtime::API::Request.new(api_client, "/features") + response = get(request.url) + response.body + end end end end diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb index cdb85902758..317e31feea8 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb @@ -1,8 +1,7 @@ # frozen_string_literal: true module QA - # Failure issue https://gitlab.com/gitlab-org/quality/staging/issues/68 - context 'Plan', :quarantine do + context 'Plan' do describe 'filter issue comments activities' do let(:issue_title) { 'issue title' } diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb new file mode 100644 index 00000000000..b68a24ec538 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb @@ -0,0 +1,58 @@ +# frozen_string_literal: true + +module QA + context 'Plan' do + describe 'mention' do + let(:user) do + Resource::User.fabricate_via_api! do |user| + user.name = "bob" + user.password = "1234test" + end + end + + before do + QA::Runtime::Env.personal_access_token = QA::Runtime::Env.admin_personal_access_token + + unless QA::Runtime::Env.personal_access_token + Runtime::Browser.visit(:gitlab, Page::Main::Login) + Page::Main::Login.perform(&:sign_in_using_admin_credentials) + end + + QA::Runtime::Env.personal_access_token = nil + + Page::Main::Menu.perform(&:sign_out) if Page::Main::Menu.perform { |p| p.has_personal_area?(wait: 0) } + + Runtime::Browser.visit(:gitlab, Page::Main::Login) + + Page::Main::Login.perform(&:sign_in_using_credentials) + + project = Resource::Project.fabricate_via_api! do |resource| + resource.name = 'project-to-test-mention' + end + project.visit! + + Page::Project::Show.perform(&:go_to_members_settings) + Page::Project::Settings::Members.perform do |members| + members.add_member(user.username) + end + + issue = Resource::Issue.fabricate_via_api! do |issue| + issue.title = 'issue to test mention' + issue.project = project + end + issue.visit! + end + + it 'user mentions another user in an issue' do + Page::Project::Issue::Show.perform do |show| + at_username = "@#{user.username}" + + show.select_all_activities_filter + show.comment(at_username) + + expect(show).to have_link(at_username) + end + end + end + end +end diff --git a/qa/qa/support/retrier.rb b/qa/qa/support/retrier.rb index 720f1d17037..3b02cb4855b 100644 --- a/qa/qa/support/retrier.rb +++ b/qa/qa/support/retrier.rb @@ -24,7 +24,7 @@ module QA end end - def retry_until(max_attempts: 3, reload_page: nil, sleep_interval: 0) + def retry_until(max_attempts: 3, reload_page: nil, sleep_interval: 0, exit_on_failure: false) QA::Runtime::Logger.debug("with retry_until: max_attempts #{max_attempts}; sleep_interval #{sleep_interval}; reload_page:#{reload_page}") attempts = 0 @@ -40,6 +40,11 @@ module QA attempts += 1 end + if exit_on_failure + QA::Runtime::Logger.debug("Raising exception after #{max_attempts} attempts") + raise + end + false end end diff --git a/qa/spec/runtime/feature_spec.rb b/qa/spec/runtime/feature_spec.rb index 192299b7857..94638d99b01 100644 --- a/qa/spec/runtime/feature_spec.rb +++ b/qa/spec/runtime/feature_spec.rb @@ -3,7 +3,8 @@ describe QA::Runtime::Feature do let(:api_client) { double('QA::Runtime::API::Client') } let(:request) { Struct.new(:url).new('http://api') } - let(:response) { Struct.new(:code).new(201) } + let(:response_post) { Struct.new(:code).new(201) } + let(:response_get) { Struct.new(:code, :body).new(200, '[{ "name": "a-flag", "state": "on" }]') } before do allow(described_class).to receive(:api_client).and_return(api_client) @@ -18,7 +19,7 @@ describe QA::Runtime::Feature do expect(described_class) .to receive(:post) .with(request.url, { value: true }) - .and_return(response) + .and_return(response_post) subject.enable('a-flag') end @@ -33,9 +34,23 @@ describe QA::Runtime::Feature do expect(described_class) .to receive(:post) .with(request.url, { value: false }) - .and_return(response) + .and_return(response_post) subject.disable('a-flag') end end + + describe '.enabled?' do + it 'returns a feature flag state' do + expect(QA::Runtime::API::Request) + .to receive(:new) + .with(api_client, "/features") + .and_return(request) + expect(described_class) + .to receive(:get) + .and_return(response_get) + + expect(subject.enabled?('a-flag')).to be_truthy + end + end end diff --git a/rubocop/cop/graphql/authorize_types.rb b/rubocop/cop/graphql/authorize_types.rb index cd8bdbaee59..c69ce10f1c5 100644 --- a/rubocop/cop/graphql/authorize_types.rb +++ b/rubocop/cop/graphql/authorize_types.rb @@ -30,7 +30,7 @@ module RuboCop def in_type?(node) path = node.location.expression.source_buffer.name - path.include?(TYPES_DIR) + path.include? TYPES_DIR end def whitelisted?(class_node) @@ -44,7 +44,7 @@ module RuboCop end def superclass_constant(class_node) - # First one is the class name itself, second is it's superclass + # First one is the class name itself, second is its superclass _class_constant, *others = class_node.descendants others.find { |node| node.const_type? && node&.const_name != 'Types' } diff --git a/rubocop/cop/graphql/descriptions.rb b/rubocop/cop/graphql/descriptions.rb new file mode 100644 index 00000000000..b4e00dfe336 --- /dev/null +++ b/rubocop/cop/graphql/descriptions.rb @@ -0,0 +1,56 @@ +# frozen_string_literal: true + +# This cop checks for missing GraphQL field descriptions. +# +# @example +# +# # bad +# class AwfulClass +# field :some_field, GraphQL::STRING_TYPE +# end +# +# class TerribleClass +# argument :some_argument, GraphQL::STRING_TYPE +# end +# +# # good +# class GreatClass +# argument :some_field, +# GraphQL::STRING_TYPE, +# description: "Well described - a superb description" +# +# field :some_field, +# GraphQL::STRING_TYPE, +# description: "A thorough and compelling description" +# end + +module RuboCop + module Cop + module Graphql + class Descriptions < RuboCop::Cop::Cop + MSG = 'Please add a `description` property.' + + # ability_field and permission_field set a default description. + def_node_matcher :fields, <<~PATTERN + (send nil? :field $...) + PATTERN + + def_node_matcher :arguments, <<~PATTERN + (send nil? :argument $...) + PATTERN + + def_node_matcher :has_description?, <<~PATTERN + (hash <(pair (sym :description) _) ...>) + PATTERN + + def on_send(node) + matches = fields(node) || arguments(node) + + return if matches.nil? + + add_offense(node, location: :expression) unless has_description?(matches.last) + end + end + end + end +end diff --git a/rubocop/rubocop.rb b/rubocop/rubocop.rb index 9d97aa86bf6..29864777f59 100644 --- a/rubocop/rubocop.rb +++ b/rubocop/rubocop.rb @@ -49,3 +49,4 @@ require_relative 'cop/code_reuse/active_record' require_relative 'cop/group_public_or_visible_to_user' require_relative 'cop/inject_enterprise_edition_module' require_relative 'cop/graphql/authorize_types' +require_relative 'cop/graphql/descriptions' diff --git a/scripts/build_assets_image b/scripts/build_assets_image index 25b6060b6c4..aff6cb24a1b 100755 --- a/scripts/build_assets_image +++ b/scripts/build_assets_image @@ -8,7 +8,7 @@ fi # Generate the image name based on the project this is being run in ASSETS_IMAGE_NAME="gitlab-assets-ce" -if [[ "${CI_PROJECT_NAME}" == "gitlab-ee" ]] +if [[ "${CI_PROJECT_NAME}" == "gitlab" ]] then ASSETS_IMAGE_NAME="gitlab-assets-ee" fi diff --git a/scripts/ee_specific_check/ee_specific_check.rb b/scripts/ee_specific_check/ee_specific_check.rb new file mode 100644 index 00000000000..98a4038ee09 --- /dev/null +++ b/scripts/ee_specific_check/ee_specific_check.rb @@ -0,0 +1,470 @@ +# frozen_string_literal: true +# rubocop: disable CodeReuse/ActiveRecord + +module EESpecificCheck + WHITELIST = [ + 'CHANGELOG-EE.md', + 'scripts/**/*', + 'vendor/assets/javascripts/jasmine-jquery.js', + '.gitlab-ci.yml', + '.gitlab/ci/rails.gitlab-ci.yml', + 'db/schema.rb', + 'locale/gitlab.pot' + ].freeze + + CompareBase = Struct.new(:ce_base, :ee_base, :ce_head, :ee_head) + GitStatus = Struct.new(:porcelain, :head) + + module_function + + def git_version + say run_git_command('--version') + end + + def say(message) + warn "\n#{message}", "\n" # puts would eat trailing newline + end + + def find_compare_base + git_clean + + ce_fetch_head = fetch_remote_ce_branch + ee_fetch_head = head_commit_sha + ce_fetch_base = find_merge_base('canonical-ce/master', ce_fetch_head) + ee_fetch_base = find_merge_base('canonical-ee/master', 'HEAD') + ce_merge_base = find_merge_base(ce_fetch_head, ee_fetch_head) + + ce_updated_head = + find_ce_compare_head(ce_fetch_head, ce_fetch_base, ce_merge_base) + + CompareBase.new( + ce_merge_base, ee_fetch_base, ce_updated_head, ee_fetch_head) + end + + def setup_canonical_remotes + run_git_command( + "remote add canonical-ee https://gitlab.com/gitlab-org/gitlab-ee.git", + "remote add canonical-ce https://gitlab.com/gitlab-org/gitlab-ce.git", + "fetch canonical-ee master --quiet --depth=9999", + "fetch canonical-ce master --quiet --depth=9999") + end + + def fetch_remote_ce_branch + setup_canonical_remotes + + remote_to_fetch, branch_to_fetch = find_remote_ce_branch + + run_git_command("fetch #{remote_to_fetch} #{branch_to_fetch} --quiet --depth=9999") + + "#{remote_to_fetch}/#{branch_to_fetch}" + end + + def find_merge_base(left, right) + merge_base = run_git_command("merge-base #{left} #{right}") + + return merge_base unless merge_base.empty? + + say <<~MESSAGE + 💥 Unfortunately we cannot find the merge-base for #{left} and #{right}, + 💥 and we'll try to fix that in: + https://gitlab.com/gitlab-org/gitlab-ee/issues/9120 + + 💥 Before that, please run this job locally as a workaround: + + ./scripts/ee-specific-lines-check + + 💥 And paste the result as a discussion to show it to the maintainer. + 💥 If you have any questions, please ping @godfat to investigate and + 💥 clarify. + MESSAGE + + exit(253) + end + + def find_ce_compare_head(ce_fetch_head, ce_fetch_base, ce_merge_base) + if git_ancestor?(ce_merge_base, ce_fetch_base) + say("CE is ahead of EE, finding backward CE head") + find_backward_ce_head(ce_fetch_head, ce_fetch_base, ce_merge_base) + else + say("CE is behind of EE, finding forward CE head") + find_forward_ce_head(ce_merge_base, ce_fetch_head) + end + end + + def git_ancestor?(ancestor, descendant) + run_git_command( + "merge-base --is-ancestor #{ancestor} #{descendant} && echo y") == 'y' + end + + def find_backward_ce_head(ce_fetch_head, ce_fetch_base, ce_merge_base) + if ce_fetch_head.start_with?('canonical-ce') # No specific CE branch + say("No CE branch found, using merge base directly") + ce_merge_base + elsif ce_fetch_base == ce_merge_base # Up-to-date, no rebase needed + say("EE is up-to-date with CE, using #{ce_fetch_head} directly") + ce_fetch_head + else + say("Performing rebase to remove commits in CE haven't merged into EE") + checkout_and_rebase(ce_merge_base, ce_fetch_base, ce_fetch_head) + end + end + + def find_forward_ce_head(ce_merge_base, ce_fetch_head) + say("Performing merge with CE master for CE branch #{ce_fetch_head}") + with_detached_head(ce_fetch_head) do + run_git_command("merge #{ce_merge_base} -s recursive -X patience -m 'ee-specific-auto-merge'") + + status = git_status + + if status.porcelain == '' + status.head + else + diff = run_git_command("diff") + run_git_command("merge --abort") + + say <<~MESSAGE + 💥 Git status not clean! This means there's a conflict in + 💥 #{ce_fetch_head} with canonical-ce/master. Please resolve + 💥 the conflict from CE master and retry this job. + + ⚠️ Git diff: + + #{diff} + MESSAGE + + exit(254) + end + end + end + + # We rebase onto the commit which is the latest commit presented in both + # CE and EE, i.e. ce_merge_base, cutting off commits aren't merged into + # EE yet. Here's an example: + # + # * o: Relevant commits + # * x: Irrelevant commits + # * !: Commits we want to cut off from CE branch + # + # ^-> o CE branch (ce_fetch_head) + # / (ce_fetch_base) + # o -> o -> ! -> x CE master + # v (ce_merge_base) + # o -> o -> o -> x EE master + # \ (ee_fetch_base) + # v-> o EE branch + # + # We want to rebase above into this: (we only change the connection) + # + # -> - -> o CE branch (ce_fetch_head) + # / (ce_fetch_base) + # o -> o -> ! -> x CE master + # v (ce_merge_base) + # o -> o -> o -> x EE master + # \ (ee_fetch_base) + # v-> o EE branch + # + # Therefore we rebase onto ce_merge_base, which is based off CE master, + # for the CE branch (ce_fetch_head), effective remove the commit marked + # as ! in the graph for CE branch. We need to remove it because it's not + # merged into EE yet, therefore won't be available in the EE branch. + # + # After rebase is done, then we could compare against + # ce_merge_base..ee_fetch_base along with ce_fetch_head..HEAD (EE branch) + # where ce_merge_base..ee_fetch_base is the update-to-date + # CE/EE difference and ce_fetch_head..HEAD is the changes we made in + # CE and EE branches. + def checkout_and_rebase(new_base, old_base, target_head) + with_detached_head(target_head) do + run_git_command("rebase --onto #{new_base} #{old_base} #{target_head}") + + status = git_status + + if status.porcelain == '' + status.head + else + diff = run_git_command("diff") + run_git_command("rebase --abort") + + say <<~MESSAGE + 💥 Git status is not clean! This means the CE branch has or had a + 💥 conflict with CE master, and we cannot resolve this in an + 💥 automatic way. + 💥 + 💥 Please rebase #{target_head} with CE master. + 💥 + 💥 For more details, please read: + 💥 https://gitlab.com/gitlab-org/gitlab-ee/issues/6038#note_86862115 + 💥 + 💥 Git diff: + + #{diff} + MESSAGE + + exit(255) + end + end + end + + def with_detached_head(target_head) + # So that we could switch back. CI sometimes doesn't have the branch, + # so we don't use current_branch here + head = current_head + + # Use detached HEAD so that we don't update HEAD + run_git_command("checkout -f #{target_head}") + git_clean + + yield + ensure # ensure would still run if we call exit, don't worry + # Make sure to switch back + run_git_command("checkout -f #{head}") + git_clean + end + + def head_commit_sha + run_git_command("rev-parse HEAD") + end + + def git_status + GitStatus.new( + run_git_command("status --porcelain"), + head_commit_sha + ) + end + + def git_clean + # We're still seeing errors not ignoring knapsack/ and rspec_flaky/ + # Instead of waiting that populate over all the branches, we could + # just remove untracked files anyway, only on CI of course in case + # we're wiping people's data! + # See https://gitlab.com/gitlab-org/gitlab-ee/issues/5912 + # Also see https://gitlab.com/gitlab-org/gitlab-ee/-/jobs/68194333 + run_git_command('clean -fd') if ENV['CI'] + end + + def remove_remotes + run_git_command( + "remote remove canonical-ee", + "remote remove canonical-ce", + "remote remove target-ce") + end + + def updated_diff_numstat(from, to) + scan_diff_numstat( + run_git_command("diff #{from}..#{to} --numstat -- . ':!ee' ':!qa/qa/ee' ':!qa/qa/ee.rb' ':!qa/qa/specs/features/ee'")) + end + + def find_remote_ce_branch + branch_to_fetch = matching_ce_refs.first + + if branch_to_fetch + say "💪 We found the branch '#{branch_to_fetch}' in the #{ce_repo_url} repository. We will fetch it." + + run_git_command("remote add target-ce #{ce_repo_url}") + + ['target-ce', branch_to_fetch] + else + say <<~MESSAGE + ⚠️ We did not find a branch that would match the current '#{current_branch}' branch in the #{ce_repo_url} repository. We will fetch 'master' instead. + ℹ️ If you have a CE branch for the current branch, make sure that its name includes '#{minimal_ce_branch_name}'. + MESSAGE + + %w[canonical-ce master] + end + end + + def ce_repo_url + @ce_repo_url ||= + begin + repo_url = ENV.fetch('CI_REPOSITORY_URL', 'https://gitlab.com/gitlab-org/gitlab-ce.git') + # This workaround can be removed once we rename the dev CE project + # https://gitlab.com/gitlab-org/gitlab-ce/issues/59107 + project_name = repo_url =~ /dev\.gitlab\.org/ ? 'gitlabhq' : 'gitlab-ce' + + repo_url.sub('gitlab-ee', project_name) + end + end + + def current_head + @current_head ||= ENV.fetch('CI_COMMIT_SHA', current_branch) + end + + def current_branch + @current_branch ||= ENV.fetch('CI_COMMIT_REF_NAME', `git rev-parse --abbrev-ref HEAD`).strip + end + + def minimal_ce_branch_name + @minimal_ce_branch_name ||= current_branch.sub(/(\Aee\-|\-ee\z)/, '') + end + + def matching_ce_refs + @matching_ce_refs ||= + run_git_command("ls-remote #{ce_repo_url} \"*#{minimal_ce_branch_name}*\"") + .scan(%r{(?<=refs/heads/|refs/tags/).+}) + .select { |branch| branch.match?(/\b#{minimal_ce_branch_name}\b/i) } + .sort_by(&:size) + end + + def scan_diff_numstat(numstat) + numstat.scan(/(\d+)\s+(\d+)\s+(.+)/) + .each_with_object(Hash.new(0)) do |(added, deleted, file), result| + result[file] = added.to_i + deleted.to_i + end + end + + def run_git_command(*commands) + cmds = commands.map { |cmd| "git #{cmd}" } + + output = run_command(*cmds) + + if commands.size == 1 + output.first + else + output + end + end + + def run_command(*commands) + commands.map do |cmd| + warn "=> Running `#{cmd}`" + + `#{cmd}`.strip + end + end +end + +if $0 == __FILE__ + require 'rspec/autorun' + + RSpec.describe EESpecificCheck do + subject { Class.new { include EESpecificCheck }.new } + + before do + allow(subject).to receive(:warn) + + EESpecificCheck.private_instance_methods.each do |name| + subject.class.__send__(:public, name) # rubocop:disable GitlabSecurity/PublicSend + end + end + + describe '.run_git_command' do + it 'returns the single output when there is a single command' do + output = subject.run_git_command('status') + + expect(output).to be_kind_of(String) + expect(subject).to have_received(:warn).with(/git status/) + end + + it 'returns an array of output for more commands' do + output = subject.run_git_command('status', 'help') + + expect(output).to all(be_a(String)) + expect(subject).to have_received(:warn).with(/git status/) + expect(subject).to have_received(:warn).with(/git help/) + end + end + + describe '.find_merge_base' do + context 'when it cannot find the merge base' do + before do + allow(subject).to receive(:say) + allow(subject).to receive(:exit) + + expect(subject).to receive(:run_git_command).and_return('') + end + + it 'calls exit(253) to fail the job and ask run it locally' do + subject.find_merge_base('master', 'HEAD') + + expect(subject).to have_received(:say) + .with(Regexp.union('./scripts/ee-specific-lines-check')) + expect(subject).to have_received(:exit) + .with(253) + end + end + + context 'when it found the merge base' do + before do + expect(subject).to receive(:run_git_command).and_return('deadbeef') + end + + it 'returns the found merge base' do + output = subject.find_merge_base('master', 'HEAD') + + expect(output).to eq('deadbeef') + end + end + end + + describe '.matching_ce_refs' do + before do + expect(subject).to receive(:current_branch).and_return(ee_branch) + expect(subject).to receive(:run_git_command) + .and_return(ls_remote_output) + end + + describe 'simple cases' do + let(:ls_remote_output) do + <<~OUTPUT + d6602ec5194c87b0fc87103ca4d67251c76f233a\trefs/tags/v9 + f25a265a342aed6041ab0cc484224d9ca54b6f41\trefs/tags/v9.12 + c5db5456ae3b0873fc659c19fafdde22313cc441\trefs/tags/v9.123 + 0918385dbd9656cab0d1d81ba7453d49bbc16250\trefs/heads/v9.x + 28862662b749fe981386814e2dba87b0e72c1eab\trefs/remotes/remote_mirror_3059/v9-to-fix-http-case-problems + 5e3496802098c86050c5b463507f3a68a83a9f02\trefs/remotes/remote_mirror_3059/29036-use-slack-service-v9 + OUTPUT + end + + context 'with a ee- prefix' do + let(:ee_branch) { 'ee-v9' } + + it 'sorts by matching size' do + expect(subject.matching_ce_refs).to eq(%w[v9 v9.x v9.12 v9.123]) + end + end + + context 'with a -ee suffix' do + let(:ee_branch) { 'v9-ee' } + + it 'sorts by matching size' do + expect(subject.matching_ce_refs).to eq(%w[v9 v9.x v9.12 v9.123]) + end + end + end + + describe 'with ambiguous branch name' do + let(:ls_remote_output) do + <<~OUTPUT + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/feature/sm/35954-expand-kubernetesservice-to-use-username-password + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/ce-to-ee-231 + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/ce-to-ee-2 + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/ce-to-1 + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/ee-to-ce-123 + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/ee-to-ce-12 + 954d7119384c9f2a3c862bac97beb641eb8755d6\trefs/heads/to-ce-1 + 28862662b749fe981386814e2dba87b0e72c1eab\trefs/remotes/remote_mirror_3059/27056-upgrade-vue-resource-to-1-0-3-to-fix-http-case-problems + 5e3496802098c86050c5b463507f3a68a83a9f02\trefs/remotes/remote_mirror_3059/29036-use-slack-service-to-notify-of-failed-pipelines + OUTPUT + end + + context 'with a ee- prefix' do + let(:ee_branch) { 'ee-to-ce' } + let(:minimal_ce_branch) { 'to-ce' } + + it 'sorts by matching size' do + expect(subject.matching_ce_refs).to eq(%w[to-ce-1 ee-to-ce-12 ee-to-ce-123]) + end + end + + context 'with a -ee suffix' do + let(:ee_branch) { 'ce-to-ee' } + let(:minimal_ce_branch) { 'ce-to' } + + it 'sorts by matching size' do + expect(subject.matching_ce_refs).to eq(%w[ce-to-1 ce-to-ee-2 ce-to-ee-231]) + end + end + end + end + end +end diff --git a/scripts/prepare_postgres_fdw.sh b/scripts/prepare_postgres_fdw.sh new file mode 100755 index 00000000000..69442d2881b --- /dev/null +++ b/scripts/prepare_postgres_fdw.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +psql -h postgres -U postgres gitlabhq_geo_test <<EOF +CREATE EXTENSION postgres_fdw; +CREATE SERVER gitlab_secondary FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'gitlabhq_test'); +CREATE USER MAPPING FOR current_user SERVER gitlab_secondary OPTIONS (user 'postgres', password ''); +CREATE SCHEMA gitlab_secondary; +IMPORT FOREIGN SCHEMA public FROM SERVER gitlab_secondary INTO gitlab_secondary; +GRANT USAGE ON FOREIGN SERVER gitlab_secondary TO current_user; +EOF + +# Ensure the FDW setting is enabled +sed -i '/fdw:/d' config/database_geo.yml +sed -i '/gitlabhq_geo_test/a\ +\ \ fdw: true' config/database_geo.yml diff --git a/scripts/review_apps/review-apps.sh b/scripts/review_apps/review-apps.sh index 76eb67b1a2e..8b64dd3292c 100755 --- a/scripts/review_apps/review-apps.sh +++ b/scripts/review_apps/review-apps.sh @@ -255,6 +255,8 @@ EOF } function display_deployment_debug() { + kubectl get pods -n "$KUBE_NAMESPACE" -lrelease=${CI_ENVIRONMENT_SLUG} + migrations_pod=$(get_pod "migrations"); if [ -z "${migrations_pod}" ]; then echoerr "Migrations pod not found." diff --git a/scripts/schema_changed.sh b/scripts/schema_changed.sh index b5e510c2367..b5e510c2367 100644..100755 --- a/scripts/schema_changed.sh +++ b/scripts/schema_changed.sh diff --git a/spec/controllers/projects/jobs_controller_spec.rb b/spec/controllers/projects/jobs_controller_spec.rb index bd3e66efd58..b455b55bd11 100644 --- a/spec/controllers/projects/jobs_controller_spec.rb +++ b/spec/controllers/projects/jobs_controller_spec.rb @@ -265,7 +265,8 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do let(:job) { create(:ci_build, :running, environment: environment.name, pipeline: pipeline) } before do - create(:deployment, :success, environment: environment, project: project) + create(:deployment, :success, :on_cluster, environment: environment, project: project) + project.add_maintainer(user) # Need to be a maintianer to view cluster.path end it 'exposes the deployment information' do @@ -276,8 +277,9 @@ describe Projects::JobsController, :clean_gitlab_redis_shared_state do expect(json_response.dig('deployment_status', 'status')).to eq 'creating' expect(json_response.dig('deployment_status', 'environment')).not_to be_nil expect(json_response.dig('deployment_status', 'environment', 'last_deployment')).not_to be_nil - expect(json_response.dig('deployment_status', 'environment', 'last_deployment')) - .not_to include('commit') + expect(json_response.dig('deployment_status', 'environment', 'last_deployment')).not_to include('commit') + expect(json_response.dig('deployment_status', 'environment', 'last_deployment', 'cluster', 'name')).to eq('test-cluster') + expect(json_response.dig('deployment_status', 'environment', 'last_deployment', 'cluster', 'path')).to be_present end end diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb index 52af470efac..5216683bd36 100644 --- a/spec/db/schema_spec.rb +++ b/spec/db/schema_spec.rb @@ -4,6 +4,8 @@ require 'spec_helper' require Rails.root.join('ee', 'spec', 'db', 'schema_support') if Gitlab.ee? describe 'Database schema' do + prepend_if_ee('EE::DB::SchemaSupport') + let(:connection) { ActiveRecord::Base.connection } let(:tables) { connection.tables } diff --git a/spec/factories/deployments.rb b/spec/factories/deployments.rb index 89ff1c527df..50dc304a10e 100644 --- a/spec/factories/deployments.rb +++ b/spec/factories/deployments.rb @@ -17,6 +17,10 @@ FactoryBot.define do unless deployment.project.repository_exists? allow(deployment.project.repository).to receive(:create_ref) end + + if deployment.cluster && deployment.cluster.project_type? && deployment.cluster.project.nil? + deployment.cluster.projects << deployment.project + end end trait :review_app do diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb index d1783de0330..cebca338f33 100644 --- a/spec/features/projects/jobs_spec.rb +++ b/spec/features/projects/jobs_spec.rb @@ -534,9 +534,32 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do end it 'shows deployment message' do - expect(page).to have_content 'This job is the most recent deployment' + expect(page).to have_content 'This job is the most recent deployment to production' expect(find('.js-environment-link')['href']).to match("environments/#{environment.id}") end + + context 'when there is a cluster used for the deployment' do + let(:cluster) { create(:cluster, name: 'the-cluster') } + let(:deployment) { create(:deployment, :success, cluster: cluster, environment: environment, project: environment.project) } + let(:user_access_level) { :maintainer } + + it 'shows a link to the cluster' do + expect(page).to have_link 'the-cluster' + end + + it 'shows the name of the cluster' do + expect(page).to have_content 'Cluster the-cluster was used' + end + + context 'when the user is not able to view the cluster' do + let(:user_access_level) { :developer } + + it 'includes only the name of the cluster without a link' do + expect(page).to have_content 'Cluster the-cluster was used' + expect(page).not_to have_link 'the-cluster' + end + end + end end context 'job is complete and not successful' do diff --git a/spec/fixtures/api/schemas/cluster_basic.json b/spec/fixtures/api/schemas/cluster_basic.json new file mode 100644 index 00000000000..6f0e77997f0 --- /dev/null +++ b/spec/fixtures/api/schemas/cluster_basic.json @@ -0,0 +1,16 @@ +{ + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { "type": "string" }, + "path": { + "oneOf": [ + { "type": "null" }, + { "type": "string" } + ] + } + }, + "additionalProperties": false +} diff --git a/spec/fixtures/api/schemas/deployment.json b/spec/fixtures/api/schemas/deployment.json index fe725b97c21..81c2d1ef5ab 100644 --- a/spec/fixtures/api/schemas/deployment.json +++ b/spec/fixtures/api/schemas/deployment.json @@ -47,6 +47,12 @@ { "$ref": "job/job.json" } ] }, + "cluster": { + "oneOf": [ + { "type": "null" }, + { "$ref": "cluster_basic.json" } + ] + }, "manual_actions": { "type": "array", "items": { "$ref": "job/job.json" } diff --git a/spec/fixtures/api/schemas/environment.json b/spec/fixtures/api/schemas/environment.json index 5b1e3c049fa..e38b05ec008 100644 --- a/spec/fixtures/api/schemas/environment.json +++ b/spec/fixtures/api/schemas/environment.json @@ -28,6 +28,8 @@ "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "can_stop": { "type": "boolean" }, + "cluster_type": { "type": "types/nullable_string.json" }, + "terminal_path": { "type": "types/nullable_string.json" }, "last_deployment": { "oneOf": [ { "type": "null" }, diff --git a/spec/frontend/clusters/stores/clusters_store_spec.js b/spec/frontend/clusters/stores/clusters_store_spec.js index 98077498998..ee3b7d8aa90 100644 --- a/spec/frontend/clusters/stores/clusters_store_spec.js +++ b/spec/frontend/clusters/stores/clusters_store_spec.js @@ -152,6 +152,7 @@ describe('Clusters Store', () => { }, }, environments: [], + fetchingEnvironments: false, }); }); diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb index 039143eb8d7..d15b5a4ab58 100644 --- a/spec/helpers/issues_helper_spec.rb +++ b/spec/helpers/issues_helper_spec.rb @@ -142,7 +142,7 @@ describe IssuesHelper do expect(link_to_discussions_to_resolve(merge_request, nil)).to include(expected_path) end - it "containst the reference to the merge request" do + it "contains the reference to the merge request" do expect(link_to_discussions_to_resolve(merge_request, nil)).to include(merge_request.to_reference) end end @@ -185,4 +185,79 @@ describe IssuesHelper do expect(helper.show_new_issue_link?(project)).to be_truthy end end + + describe '#issue_closed_link' do + let(:new_issue) { create(:issue, project: project) } + let(:guest) { create(:user) } + + before do + allow(helper).to receive(:can?) do |*args| + Ability.allowed?(*args) + end + end + + shared_examples 'successfully displays link to issue and with css class' do |action| + it 'returns link' do + link = "<a class=\"#{css_class}\" href=\"/#{new_issue.project.full_path}/issues/#{new_issue.iid}\">(#{action})</a>" + + expect(helper.issue_closed_link(issue, user, css_class: css_class)).to match(link) + end + end + + shared_examples 'does not display link' do + it 'returns nil' do + expect(helper.issue_closed_link(issue, user)).to be_nil + end + end + + context 'with linked issue' do + context 'with moved issue' do + before do + issue.update(moved_to: new_issue) + end + + context 'when user has permission to see new issue' do + let(:user) { project.owner } + let(:css_class) { 'text-white text-underline' } + + it_behaves_like 'successfully displays link to issue and with css class', 'moved' + end + + context 'when user has no permission to see new issue' do + let(:user) { guest } + + it_behaves_like 'does not display link' + end + end + + context 'with duplicated issue' do + before do + issue.update(duplicated_to: new_issue) + end + + context 'when user has permission to see new issue' do + let(:user) { project.owner } + let(:css_class) { 'text-white text-underline' } + + it_behaves_like 'successfully displays link to issue and with css class', 'duplicated' + end + + context 'when user has no permission to see new issue' do + let(:user) { guest } + + it_behaves_like 'does not display link' + end + end + end + + context 'without linked issue' do + let(:user) { project.owner } + + before do + issue.update(moved_to: nil, duplicated_to: nil) + end + + it_behaves_like 'does not display link' + end + end end diff --git a/spec/helpers/onboarding_experiment_helper_spec.rb b/spec/helpers/onboarding_experiment_helper_spec.rb index 5b7d9b1c2e6..cada91bff3c 100644 --- a/spec/helpers/onboarding_experiment_helper_spec.rb +++ b/spec/helpers/onboarding_experiment_helper_spec.rb @@ -4,17 +4,17 @@ require 'spec_helper' describe OnboardingExperimentHelper, type: :helper do describe '.allow_access_to_onboarding?' do - context "when we're not gitlab.com" do + context "when we're not gitlab.com or dev env" do it 'returns false' do - allow(::Gitlab).to receive(:com?).and_return(false) + allow(::Gitlab).to receive(:dev_env_or_com?).and_return(false) expect(helper.allow_access_to_onboarding?).to be(false) end end - context "when we're gitlab.com" do + context "when we're gitlab.com or dev env" do before do - allow(::Gitlab).to receive(:com?).and_return(true) + allow(::Gitlab).to receive(:dev_env_or_com?).and_return(true) end context 'and the :user_onboarding feature is not enabled' do diff --git a/spec/javascripts/gl_dropdown_spec.js b/spec/javascripts/gl_dropdown_spec.js index 8c7820ddb52..00bc552bd7d 100644 --- a/spec/javascripts/gl_dropdown_spec.js +++ b/spec/javascripts/gl_dropdown_spec.js @@ -243,14 +243,23 @@ describe('glDropdown', function describeDropdown() { }); describe('renderItem', () => { + function dropdownWithOptions(options) { + const $dropdownDiv = $('<div />'); + + $dropdownDiv.glDropdown(options); + + return $dropdownDiv.data('glDropdown'); + } + + function basicDropdown() { + return dropdownWithOptions({}); + } + describe('without selected value', () => { let dropdown; beforeEach(() => { - const dropdownOptions = {}; - const $dropdownDiv = $('<div />'); - $dropdownDiv.glDropdown(dropdownOptions); - dropdown = $dropdownDiv.data('glDropdown'); + dropdown = basicDropdown(); }); it('marks items without ID as active', () => { @@ -275,6 +284,35 @@ describe('glDropdown', function describeDropdown() { expect(link).not.toHaveClass('is-active'); }); }); + + it('should return an empty .separator li when when appropriate', () => { + const dropdown = basicDropdown(); + const sep = { type: 'separator' }; + const li = dropdown.renderItem(sep); + + expect(li).toHaveClass('separator'); + expect(li.childNodes.length).toEqual(0); + }); + + it('should return an empty .divider li when when appropriate', () => { + const dropdown = basicDropdown(); + const div = { type: 'divider' }; + const li = dropdown.renderItem(div); + + expect(li).toHaveClass('divider'); + expect(li.childNodes.length).toEqual(0); + }); + + it('should return a .dropdown-header li with the correct content when when appropriate', () => { + const dropdown = basicDropdown(); + const text = 'My Header'; + const header = { type: 'header', content: text }; + const li = dropdown.renderItem(header); + + expect(li).toHaveClass('dropdown-header'); + expect(li.childNodes.length).toEqual(1); + expect(li.textContent).toEqual(text); + }); }); it('should keep selected item after selecting a second time', () => { diff --git a/spec/javascripts/jobs/components/environments_block_spec.js b/spec/javascripts/jobs/components/environments_block_spec.js index 0866ddd21d8..4bbc5f5a348 100644 --- a/spec/javascripts/jobs/components/environments_block_spec.js +++ b/spec/javascripts/jobs/components/environments_block_spec.js @@ -18,6 +18,8 @@ describe('Environments block', () => { name: 'environment', }; + const lastDeployment = { iid: 'deployment', deployable: { build_path: 'bar' } }; + afterEach(() => { vm.$destroy(); }); @@ -45,7 +47,7 @@ describe('Environments block', () => { deploymentStatus: { status: 'out_of_date', environment: Object.assign({}, environment, { - last_deployment: { iid: 'deployment', deployable: { build_path: 'bar' } }, + last_deployment: lastDeployment, }), }, iconStatus: status, @@ -99,10 +101,7 @@ describe('Environments block', () => { deploymentStatus: { status: 'creating', environment: Object.assign({}, environment, { - last_deployment: { - iid: 'deployment', - deployable: { build_path: 'foo' }, - }, + last_deployment: lastDeployment, }), }, iconStatus: status, @@ -112,7 +111,7 @@ describe('Environments block', () => { 'This job is creating a deployment to environment and will overwrite the latest deployment.', ); - expect(vm.$el.querySelector('.js-job-deployment-link').getAttribute('href')).toEqual('foo'); + expect(vm.$el.querySelector('.js-job-deployment-link').getAttribute('href')).toEqual('bar'); }); }); @@ -146,4 +145,71 @@ describe('Environments block', () => { }); }); }); + + describe('with a cluster', () => { + it('renders the cluster link', () => { + const cluster = { + name: 'the-cluster', + path: '/the-cluster-path', + }; + vm = mountComponent(Component, { + deploymentStatus: { + status: 'last', + environment: Object.assign({}, environment, { + last_deployment: { + ...lastDeployment, + cluster, + }, + }), + }, + iconStatus: status, + }); + + expect(vm.$el.textContent.trim()).toContain('Cluster the-cluster was used.'); + + expect(vm.$el.querySelector('.js-job-cluster-link').getAttribute('href')).toEqual( + '/the-cluster-path', + ); + }); + + describe('when the cluster is missing the path', () => { + it('renders the name without a link', () => { + const cluster = { + name: 'the-cluster', + }; + vm = mountComponent(Component, { + deploymentStatus: { + status: 'last', + environment: Object.assign({}, environment, { + last_deployment: { + ...lastDeployment, + cluster, + }, + }), + }, + iconStatus: status, + }); + + expect(vm.$el.textContent.trim()).toContain('Cluster the-cluster was used.'); + + expect(vm.$el.querySelector('.js-job-cluster-link')).toBeNull(); + }); + }); + }); + + describe('without a cluster', () => { + it('does not render a cluster link', () => { + vm = mountComponent(Component, { + deploymentStatus: { + status: 'last', + environment: Object.assign({}, environment, { + last_deployment: lastDeployment, + }), + }, + iconStatus: status, + }); + + expect(vm.$el.querySelector('.js-job-cluster-link')).toBeNull(); + }); + }); }); diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb index c9fde06cbae..6b5a355e598 100644 --- a/spec/lib/gitlab/email/receiver_spec.rb +++ b/spec/lib/gitlab/email/receiver_spec.rb @@ -14,6 +14,7 @@ describe Gitlab::Email::Receiver do allow(handler).to receive(:execute) allow(handler).to receive(:metrics_params) + allow(handler).to receive(:metrics_event) end it "finds the mail key" do @@ -46,4 +47,12 @@ describe Gitlab::Email::Receiver do expect { receiver.execute }.to raise_error(Gitlab::Email::AutoGeneratedEmailError) end end + + it "requires all handlers to have a unique metric_event" do + events = Gitlab::Email::Handler.handlers.map do |handler| + handler.new(Mail::Message.new, 'gitlabhq/gitlabhq+auth_token').metrics_event + end + + expect(events.uniq.count).to eq events.count + end end diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb index b9c21b3a7bd..d584cdbe280 100644 --- a/spec/lib/gitlab/git_access_spec.rb +++ b/spec/lib/gitlab/git_access_spec.rb @@ -943,7 +943,7 @@ describe Gitlab::GitAccess do changes = ['6f6d7e7ed 570e7b2ab refs/heads/master', '6f6d7e7ed 570e7b2ab refs/heads/feature'] # There is still an N+1 query with protected branches - expect { access.check('git-receive-pack', changes) }.not_to exceed_query_limit(control_count).with_threshold(1) + expect { access.check('git-receive-pack', changes) }.not_to exceed_query_limit(control_count).with_threshold(2) end it 'raises TimeoutError when #check_single_change_access raises a timeout error' do diff --git a/spec/lib/gitlab/hook_data/issue_builder_spec.rb b/spec/lib/gitlab/hook_data/issue_builder_spec.rb index b06d05c1c7f..6013fb78bc7 100644 --- a/spec/lib/gitlab/hook_data/issue_builder_spec.rb +++ b/spec/lib/gitlab/hook_data/issue_builder_spec.rb @@ -23,6 +23,7 @@ describe Gitlab::HookData::IssueBuilder do last_edited_by_id milestone_id moved_to_id + duplicated_to_id project_id relative_position state diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index e496ab4cd35..6d573a4f39a 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -14,6 +14,7 @@ issues: - todos - user_agent_detail - moved_to +- duplicated_to - events - merge_requests_closing_issues - metrics diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index e9750d23c53..2f178648838 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -19,6 +19,7 @@ Issue: - closed_by_id - due_date - moved_to_id +- duplicated_to_id - lock_version - milestone_id - weight diff --git a/spec/lib/gitlab/url_blocker_spec.rb b/spec/lib/gitlab/url_blocker_spec.rb index 6d1d7e48326..6ce002ad70e 100644 --- a/spec/lib/gitlab/url_blocker_spec.rb +++ b/spec/lib/gitlab/url_blocker_spec.rb @@ -30,8 +30,12 @@ describe Gitlab::UrlBlocker do context 'when URI is internal' do let(:import_url) { 'http://localhost' } + before do + stub_dns(import_url, ip_address: '127.0.0.1') + end + it_behaves_like 'validates URI and hostname' do - let(:expected_uri) { 'http://[::1]' } + let(:expected_uri) { 'http://127.0.0.1' } let(:expected_hostname) { 'localhost' } end end @@ -347,6 +351,7 @@ describe Gitlab::UrlBlocker do end before do + allow(ApplicationSetting).to receive(:current).and_return(ApplicationSetting.new) stub_application_setting(outbound_local_requests_whitelist: whitelist) end @@ -384,9 +389,15 @@ describe Gitlab::UrlBlocker do it_behaves_like 'allows local requests', { allow_localhost: false, allow_local_network: false } it 'whitelists IP when dns_rebind_protection is disabled' do - stub_domain_resolv('example.com', '192.168.1.1') do - expect(described_class).not_to be_blocked_url("http://example.com", - url_blocker_attributes.merge(dns_rebind_protection: false)) + url = "http://example.com" + attrs = url_blocker_attributes.merge(dns_rebind_protection: false) + + stub_domain_resolv('example.com', '192.168.1.2') do + expect(described_class).not_to be_blocked_url(url, attrs) + end + + stub_domain_resolv('example.com', '192.168.1.3') do + expect(described_class).to be_blocked_url(url, attrs) end end end @@ -437,6 +448,51 @@ describe Gitlab::UrlBlocker do url_blocker_attributes) end end + + shared_examples 'dns rebinding checks' do + shared_examples 'whitelists the domain' do + let(:whitelist) { [domain] } + let(:url) { "http://#{domain}" } + + before do + stub_env('RSPEC_ALLOW_INVALID_URLS', 'false') + end + + it do + expect(described_class).not_to be_blocked_url(url, dns_rebind_protection: dns_rebind_value) + end + end + + context 'when dns_rebinding_setting is' do + context 'enabled' do + let(:dns_rebind_value) { true } + + it_behaves_like 'whitelists the domain' + end + + context 'disabled' do + let(:dns_rebind_value) { false } + + it_behaves_like 'whitelists the domain' + end + end + end + + context 'when the domain cannot be resolved' do + let(:domain) { 'foobar.x' } + + it_behaves_like 'dns rebinding checks' + end + + context 'when the domain can be resolved' do + let(:domain) { 'example.com' } + + before do + stub_dns(url, ip_address: '93.184.216.34') + end + + it_behaves_like 'dns rebinding checks' + end end context 'with ip ranges in whitelist' do diff --git a/spec/lib/gitlab/url_blockers/url_whitelist_spec.rb b/spec/lib/gitlab/url_blockers/url_whitelist_spec.rb new file mode 100644 index 00000000000..906e0f0ba3d --- /dev/null +++ b/spec/lib/gitlab/url_blockers/url_whitelist_spec.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Gitlab::UrlBlockers::UrlWhitelist do + include StubRequests + + let(:whitelist) { [] } + + before do + allow(ApplicationSetting).to receive(:current).and_return(ApplicationSetting.new) + stub_application_setting(outbound_local_requests_whitelist: whitelist) + end + + describe '#domain_whitelisted?' do + let(:whitelist) do + [ + 'www.example.com', + 'example.com' + ] + end + + it 'returns true if domains present in whitelist' do + aggregate_failures do + whitelist.each do |domain| + expect(described_class).to be_domain_whitelisted(domain) + end + + ['subdomain.example.com', 'example.org'].each do |domain| + expect(described_class).not_to be_domain_whitelisted(domain) + end + end + end + + it 'returns false when domain is blank' do + expect(described_class).not_to be_domain_whitelisted(nil) + end + end + + describe '#ip_whitelisted?' do + let(:whitelist) do + [ + '0.0.0.0', + '127.0.0.1', + '192.168.1.1', + '0:0:0:0:0:ffff:192.168.1.2', + '::ffff:c0a8:102', + 'fc00:bf8b:e62c:abcd:abcd:aaaa:aaaa:aaaa', + '0:0:0:0:0:ffff:169.254.169.254', + '::ffff:a9fe:a9fe', + '::ffff:a9fe:a864', + 'fe80::c800:eff:fe74:8' + ] + end + + it 'returns true if ips present in whitelist' do + aggregate_failures do + whitelist.each do |ip_address| + expect(described_class).to be_ip_whitelisted(ip_address) + end + + ['172.16.2.2', '127.0.0.2', 'fe80::c800:eff:fe74:9'].each do |ip_address| + expect(described_class).not_to be_ip_whitelisted(ip_address) + end + end + end + + it 'returns false when ip is blank' do + expect(described_class).not_to be_ip_whitelisted(nil) + end + end +end diff --git a/spec/lib/gitlab_spec.rb b/spec/lib/gitlab_spec.rb index 589dac61528..ccb5cb3aa43 100644 --- a/spec/lib/gitlab_spec.rb +++ b/spec/lib/gitlab_spec.rb @@ -21,23 +21,23 @@ describe Gitlab do context 'when a REVISION file exists' do before do expect(File).to receive(:exist?) - .with(described_class.root.join('REVISION')) - .and_return(true) + .with(described_class.root.join('REVISION')) + .and_return(true) end it 'returns the actual Git revision' do expect(File).to receive(:read) - .with(described_class.root.join('REVISION')) - .and_return("abc123\n") + .with(described_class.root.join('REVISION')) + .and_return("abc123\n") expect(described_class.revision).to eq('abc123') end it 'memoizes the revision' do expect(File).to receive(:read) - .once - .with(described_class.root.join('REVISION')) - .and_return("abc123\n") + .once + .with(described_class.root.join('REVISION')) + .and_return("abc123\n") 2.times { described_class.revision } end @@ -47,8 +47,8 @@ describe Gitlab do context 'when the Git command succeeds' do before do expect(Gitlab::Popen).to receive(:popen_with_detail) - .with(cmd) - .and_return(Gitlab::Popen::Result.new(cmd, 'abc123', '', double(success?: true))) + .with(cmd) + .and_return(Gitlab::Popen::Result.new(cmd, 'abc123', '', double(success?: true))) end it 'returns the actual Git revision' do @@ -59,8 +59,8 @@ describe Gitlab do context 'when the Git command fails' do before do expect(Gitlab::Popen).to receive(:popen_with_detail) - .with(cmd) - .and_return(Gitlab::Popen::Result.new(cmd, '', 'fatal: Not a git repository', double('Process::Status', success?: false))) + .with(cmd) + .and_return(Gitlab::Popen::Result.new(cmd, '', 'fatal: Not a git repository', double('Process::Status', success?: false))) end it 'returns "Unknown"' do @@ -123,6 +123,27 @@ describe Gitlab do end end + describe '.dev_env_or_com?' do + it 'is true when on .com' do + allow(described_class).to receive(:com?).and_return(true) + + expect(described_class.dev_env_or_com?).to eq true + end + + it 'is true when dev env' do + allow(described_class).to receive(:com?).and_return(false) + allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('development')) + + expect(described_class.dev_env_or_com?).to eq true + end + + it 'is false when not dev or com' do + allow(described_class).to receive(:com?).and_return(false) + + expect(described_class.dev_env_or_com?).to eq false + end + end + describe '.ee?' do before do described_class.instance_variable_set(:@is_ee, nil) @@ -138,12 +159,12 @@ describe Gitlab do allow(described_class) .to receive(:root) - .and_return(root) + .and_return(root) allow(root) .to receive(:join) - .with('ee/app/models/license.rb') - .and_return(license_path) + .with('ee/app/models/license.rb') + .and_return(license_path) expect(described_class.ee?).to eq(true) end @@ -154,12 +175,12 @@ describe Gitlab do allow(described_class) .to receive(:root) - .and_return(Pathname.new('dummy')) + .and_return(Pathname.new('dummy')) allow(root) .to receive(:join) - .with('ee/app/models/license.rb') - .and_return(license_path) + .with('ee/app/models/license.rb') + .and_return(license_path) expect(described_class.ee?).to eq(false) end diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 2e7d78d77a8..9c58d307c4c 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -7,6 +7,10 @@ describe Issue do describe "Associations" do it { is_expected.to belong_to(:milestone) } + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:moved_to).class_name('Issue') } + it { is_expected.to belong_to(:duplicated_to).class_name('Issue') } + it { is_expected.to belong_to(:closed_by).class_name('User') } it { is_expected.to have_many(:assignees) } end @@ -310,6 +314,22 @@ describe Issue do end end + describe '#duplicated?' do + let(:issue) { create(:issue) } + subject { issue.duplicated? } + + context 'issue not duplicated' do + it { is_expected.to eq false } + end + + context 'issue already duplicated' do + let(:duplicated_to_issue) { create(:issue) } + let(:issue) { create(:issue, duplicated_to: duplicated_to_issue) } + + it { is_expected.to eq true } + end + end + describe '#suggested_branch_name' do let(:repository) { double } diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index 11234982dd4..fde1b096c76 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -195,7 +195,6 @@ describe MergeRequest do with_them do it "validates source_branch" do subject = build(:merge_request, source_branch: branch_name, target_branch: 'master') - subject.valid? expect(subject.errors.added?(:source_branch)).to eq(!valid) @@ -203,7 +202,6 @@ describe MergeRequest do it "validates target_branch" do subject = build(:merge_request, source_branch: 'master', target_branch: branch_name) - subject.valid? expect(subject.errors.added?(:target_branch)).to eq(!valid) diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb index 5c9a5b73ee5..e58f1b7d9dc 100644 --- a/spec/requests/git_http_spec.rb +++ b/spec/requests/git_http_spec.rb @@ -1,4 +1,4 @@ -require "spec_helper" +require 'spec_helper' describe 'Git HTTP requests' do include ProjectForksHelper diff --git a/spec/rubocop/cop/graphql/authorize_types_spec.rb b/spec/rubocop/cop/graphql/authorize_types_spec.rb index eae3e176d64..af4315ecd34 100644 --- a/spec/rubocop/cop/graphql/authorize_types_spec.rb +++ b/spec/rubocop/cop/graphql/authorize_types_spec.rb @@ -11,6 +11,23 @@ describe RuboCop::Cop::Graphql::AuthorizeTypes do subject(:cop) { described_class.new } + context 'when NOT in a type folder' do + before do + allow(cop).to receive(:in_type?).and_return(false) + end + + it 'does not add an offense even though there is no authorize call' do + expect_no_offenses(<<~TYPE.strip) + module Types + class AType < BaseObject + field :a_thing + field :another_thing + end + end + TYPE + end + end + context 'when in a type folder' do before do allow(cop).to receive(:in_type?).and_return(true) diff --git a/spec/rubocop/cop/graphql/descriptions_spec.rb b/spec/rubocop/cop/graphql/descriptions_spec.rb new file mode 100644 index 00000000000..8cfdc05172d --- /dev/null +++ b/spec/rubocop/cop/graphql/descriptions_spec.rb @@ -0,0 +1,75 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' +require 'rubocop' +require 'rubocop/rspec/support' +require_relative '../../../../rubocop/cop/graphql/descriptions' + +describe RuboCop::Cop::Graphql::Descriptions do + include RuboCop::RSpec::ExpectOffense + include CopHelper + + subject(:cop) { described_class.new } + + context 'fields' do + it 'adds an offense when there is no field description' do + inspect_source(<<~TYPE) + module Types + class FakeType < BaseObject + field :a_thing, + GraphQL::STRING_TYPE, + null: false + end + end + TYPE + + expect(cop.offenses.size).to eq 1 + end + + it 'does not add an offense for fields with a description' do + expect_no_offenses(<<~TYPE.strip) + module Types + class FakeType < BaseObject + graphql_name 'FakeTypeName' + + argument :a_thing, + GraphQL::STRING_TYPE, + null: false, + description: 'A descriptive description' + end + end + TYPE + end + end + + context 'arguments' do + it 'adds an offense when there is no argument description' do + inspect_source(<<~TYPE) + module Types + class FakeType < BaseObject + argument :a_thing, + GraphQL::STRING_TYPE, + null: false + end + end + TYPE + + expect(cop.offenses.size).to eq 1 + end + + it 'does not add an offense for arguments with a description' do + expect_no_offenses(<<~TYPE.strip) + module Types + class FakeType < BaseObject + graphql_name 'FakeTypeName' + + argument :a_thing, + GraphQL::STRING_TYPE, + null: false, + description: 'Behold! A description' + end + end + TYPE + end + end +end diff --git a/spec/serializers/cluster_basic_entity_spec.rb b/spec/serializers/cluster_basic_entity_spec.rb new file mode 100644 index 00000000000..6762eb6ab3d --- /dev/null +++ b/spec/serializers/cluster_basic_entity_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +describe ClusterBasicEntity do + describe '#as_json' do + subject { described_class.new(cluster, request: request).as_json } + let(:maintainer) { create(:user) } + let(:developer) { create(:user) } + let(:current_user) { maintainer } + let(:request) { double(:request, current_user: current_user) } + let(:project) { create(:project) } + let(:cluster) { create(:cluster, name: 'the-cluster', projects: [project]) } + + before do + project.add_maintainer(maintainer) + project.add_developer(developer) + end + + it 'matches cluster_basic entity schema' do + expect(subject.as_json).to match_schema('cluster_basic') + end + + it 'exposes the cluster details' do + expect(subject[:name]).to eq('the-cluster') + expect(subject[:path]).to eq("/#{project.full_path}/clusters/#{cluster.id}") + end + + context 'when the user does not have permission to view the cluster' do + let(:current_user) { developer } + + it 'does not include the path' do + expect(subject[:path]).to be_nil + end + end + end +end diff --git a/spec/serializers/issue_entity_spec.rb b/spec/serializers/issue_entity_spec.rb index 0e05b3c84f4..53278062de9 100644 --- a/spec/serializers/issue_entity_spec.rb +++ b/spec/serializers/issue_entity_spec.rb @@ -50,4 +50,44 @@ describe IssueEntity do end end end + + context 'when issue got duplicated' do + let(:private_project) { create(:project, :private) } + let(:member) { create(:user) } + let(:issue) { create(:issue, project: project) } + let(:new_issue) { create(:issue, project: private_project) } + + before do + Issues::DuplicateService + .new(project, member) + .execute(issue, new_issue) + end + + context 'when user cannot read new issue' do + let(:non_member) { create(:user) } + + it 'does not return duplicated_to_id' do + request = double('request', current_user: non_member) + + response = described_class.new(issue, request: request).as_json + + expect(response[:duplicated_to_id]).to be_nil + end + end + + context 'when user can read target project' do + before do + project.add_developer(member) + private_project.add_developer(member) + end + + it 'returns duplicated duplicated_to_id' do + request = double('request', current_user: member) + + response = described_class.new(issue, request: request).as_json + + expect(response[:duplicated_to_id]).to eq(issue.duplicated_to_id) + end + end + end end diff --git a/spec/services/issues/duplicate_service_spec.rb b/spec/services/issues/duplicate_service_spec.rb index 2c9581b993c..41a151b0ca1 100644 --- a/spec/services/issues/duplicate_service_spec.rb +++ b/spec/services/issues/duplicate_service_spec.rb @@ -77,6 +77,12 @@ describe Issues::DuplicateService do subject.execute(duplicate_issue, canonical_issue) end + + it 'updates duplicate issue with canonical issue id' do + subject.execute(duplicate_issue, canonical_issue) + + expect(duplicate_issue.reload.duplicated_to).to eq(canonical_issue) + end end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 47f09bf14d0..7d44b2340f3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -32,6 +32,8 @@ end require 'rainbow/ext/string' Rainbow.enabled = false +require_relative('../ee/spec/spec_helper') if Gitlab.ee? + # Requires supporting ruby files with custom matchers and macros, etc, # in spec/support/ and its subdirectories. # Requires helpers, and shared contexts/examples first since they're used in other support files diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb index 041ffa25535..5da707b11f9 100644 --- a/spec/support/db_cleaner.rb +++ b/spec/support/db_cleaner.rb @@ -13,3 +13,5 @@ module DbCleaner DatabaseCleaner[:active_record, { connection: ActiveRecord::Base }] end end + +DbCleaner.prepend_if_ee('EE::DbCleaner') diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb index beb346b2855..4d2ad165fd6 100644 --- a/spec/support/helpers/graphql_helpers.rb +++ b/spec/support/helpers/graphql_helpers.rb @@ -172,6 +172,31 @@ module GraphqlHelpers post_graphql(mutation.query, current_user: current_user, variables: mutation.variables) end + # this implements GraphQL multipart request v2 + # https://github.com/jaydenseric/graphql-multipart-request-spec/tree/v2.0.0-alpha.2 + # this is simplified and do not support file deduplication + def mutation_to_apollo_uploads_param(mutation, files: []) + operations = { 'query' => mutation.query, 'variables' => mutation.variables } + map = {} + extracted_files = {} + + files.each_with_index do |file_path, idx| + apollo_idx = (idx + 1).to_s + parent_dig_path = file_path[0..-2] + file_key = file_path[-1] + + parent = operations['variables'] + parent = parent.dig(*parent_dig_path) unless parent_dig_path.empty? + + extracted_files[apollo_idx] = parent[file_key] + parent[file_key] = nil + + map[apollo_idx] = ["variables.#{file_path.join('.')}"] + end + + { operations: operations.to_json, map: map.to_json }.merge(extracted_files) + end + # Raises an error if no data is found def graphql_data json_response['data'] || (raise NoData, graphql_errors) diff --git a/spec/support/helpers/ldap_helpers.rb b/spec/support/helpers/ldap_helpers.rb index dce8a3803f5..0549c56c753 100644 --- a/spec/support/helpers/ldap_helpers.rb +++ b/spec/support/helpers/ldap_helpers.rb @@ -70,3 +70,5 @@ module LdapHelpers .to receive(:ldap_search).and_raise(Gitlab::Auth::LDAP::LDAPConnectionError) end end + +LdapHelpers.include_if_ee('EE::LdapHelpers') diff --git a/spec/support/helpers/license_helper.rb b/spec/support/helpers/license_helper.rb index 4aaad55a8ef..a1defba9ccb 100644 --- a/spec/support/helpers/license_helper.rb +++ b/spec/support/helpers/license_helper.rb @@ -6,3 +6,5 @@ module LicenseHelpers # do nothing end end + +LicenseHelpers.prepend_if_ee('EE::LicenseHelpers') diff --git a/spec/support/helpers/login_helpers.rb b/spec/support/helpers/login_helpers.rb index 2b508ee6f2c..140ad173d38 100644 --- a/spec/support/helpers/login_helpers.rb +++ b/spec/support/helpers/login_helpers.rb @@ -211,3 +211,5 @@ module LoginHelpers allow(Gitlab::Auth::Saml::Config).to receive_messages({ options: { name: 'saml', groups_attribute: 'groups', external_groups: groups, args: {} } }) end end + +LoginHelpers.prepend_if_ee('EE::LoginHelpers') diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb index 2727ab7fb1e..a3145ed91bd 100644 --- a/spec/support/helpers/migrations_helpers.rb +++ b/spec/support/helpers/migrations_helpers.rb @@ -133,3 +133,5 @@ module MigrationsHelpers end end end + +MigrationsHelpers.prepend_if_ee('EE::MigrationsHelpers') diff --git a/spec/support/helpers/stub_configuration.rb b/spec/support/helpers/stub_configuration.rb index f364e4fd158..0dc6e851190 100644 --- a/spec/support/helpers/stub_configuration.rb +++ b/spec/support/helpers/stub_configuration.rb @@ -149,3 +149,5 @@ end require_relative '../../../ee/spec/support/helpers/ee/stub_configuration' if Dir.exist?("#{__dir__}/../../../ee") + +StubConfiguration.prepend_if_ee('EE::StubConfiguration') diff --git a/spec/support/helpers/stub_gitlab_calls.rb b/spec/support/helpers/stub_gitlab_calls.rb index 7d10cffe920..e3dde888277 100644 --- a/spec/support/helpers/stub_gitlab_calls.rb +++ b/spec/support/helpers/stub_gitlab_calls.rb @@ -139,3 +139,5 @@ module StubGitlabCalls JSON.parse f end end + +StubGitlabCalls.prepend_if_ee('EE::StubGitlabCalls') diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb index e5b8bb712bb..3f7002b8768 100644 --- a/spec/support/helpers/stub_object_storage.rb +++ b/spec/support/helpers/stub_object_storage.rb @@ -78,3 +78,5 @@ end require_relative '../../../ee/spec/support/helpers/ee/stub_object_storage' if Dir.exist?("#{__dir__}/../../../ee") + +StubObjectStorage.prepend_if_ee('EE::StubObjectStorage') diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb index 8ca362ce2df..3274651ef19 100644 --- a/spec/support/helpers/test_env.rb +++ b/spec/support/helpers/test_env.rb @@ -418,3 +418,8 @@ module TestEnv true end end + +require_relative('../../../ee/spec/support/helpers/ee/test_env') if Gitlab.ee? + +::TestEnv.prepend_if_ee('::EE::TestEnv') +::TestEnv.extend_if_ee('::EE::TestEnv') diff --git a/spec/support/helpers/workhorse_helpers.rb b/spec/support/helpers/workhorse_helpers.rb index fdbfe53fa39..40007a14b85 100644 --- a/spec/support/helpers/workhorse_helpers.rb +++ b/spec/support/helpers/workhorse_helpers.rb @@ -29,7 +29,8 @@ module WorkhorseHelpers post(url, params: workhorse_params, - headers: workhorse_rewritten_fields_header('file' => file.path) + headers: workhorse_rewritten_fields_header(file_key => file.path), + env: { 'CONTENT_TYPE' => 'multipart/form-data' } ) end diff --git a/spec/support/matchers/markdown_matchers.rb b/spec/support/matchers/markdown_matchers.rb index 12e8fa83a60..3245f8418b1 100644 --- a/spec/support/matchers/markdown_matchers.rb +++ b/spec/support/matchers/markdown_matchers.rb @@ -230,3 +230,5 @@ module RSpec::Matchers::DSL::Macros end end end + +MarkdownMatchers.prepend_if_ee('EE::MarkdownMatchers') diff --git a/spec/views/projects/issues/show.html.haml_spec.rb b/spec/views/projects/issues/show.html.haml_spec.rb index 1ca9eaf8fdb..d734d0b4a20 100644 --- a/spec/views/projects/issues/show.html.haml_spec.rb +++ b/spec/views/projects/issues/show.html.haml_spec.rb @@ -56,7 +56,41 @@ describe 'projects/issues/show' do end end - it 'shows "Closed" if an issue has not been moved' do + context 'when the issue was duplicated' do + let(:new_issue) { create(:issue, project: project, author: user) } + + before do + issue.duplicated_to = new_issue + end + + context 'when user can see the duplicated issue' do + before do + project.add_developer(user) + end + + it 'shows "Closed (duplicated)" if an issue has been duplicated' do + render + + expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed (duplicated)') + end + + it 'links "duplicated" to the new issue the original issue was duplicated to' do + render + + expect(rendered).to have_selector("a[href=\"#{issue_path(new_issue)}\"]", text: 'duplicated') + end + end + + context 'when user cannot see duplicated issue' do + it 'does not show duplicated issue link' do + render + + expect(rendered).not_to have_selector("a[href=\"#{issue_path(new_issue)}\"]", text: 'duplicated') + end + end + end + + it 'shows "Closed" if an issue has not been moved or duplicated' do render expect(rendered).to have_selector('.status-box-issue-closed:not(.hidden)', text: 'Closed') diff --git a/spec/views/shared/_label_row.html.haml_spec.rb b/spec/views/shared/_label_row.html.haml_spec.rb index 4cce13aa37c..0764f8480c8 100644 --- a/spec/views/shared/_label_row.html.haml_spec.rb +++ b/spec/views/shared/_label_row.html.haml_spec.rb @@ -1,3 +1,4 @@ +# frozen_string_literal: true require 'spec_helper' describe 'shared/_label_row.html.haml' do |