diff --git a/.eslintignore b/.eslintignore index 9a5e15c86a..f364771e54 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,6 +9,6 @@ /scripts/ /tmp/ /vendor/ -jest.config.js +jest.config.*.js karma.config.js webpack.config.js diff --git a/.eslintrc.yml b/.eslintrc.yml index 0639228fe5..f8bc2a3ae9 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -22,17 +22,16 @@ rules: - allow: - __ - _links - # Disabled for now, to make the airbnb-base 12.1.0 -> 13.1.0 update smoother - no-else-return: - - error - - allowElseIf: true import/no-unresolved: - error - ignore: # https://gitlab.com/gitlab-org/gitlab/issues/38226 - '^ee_component/' - import/no-useless-path-segments: off import/order: off + # Disabled for now, to make the airbnb-base 12.1.0 -> 13.1.0 update smoother + no-else-return: + - error + - allowElseIf: true lines-between-class-members: off # Disabled for now, to make the plugin-vue 4.5 -> 5.0 update smoother vue/no-confusing-v-for-v-if: error @@ -45,8 +44,6 @@ rules: no-jquery/no-serialize: error promise/always-return: off promise/no-callback-in-promise: off - # Make update to eslint@6 smoother: - prefer-object-spread: off overrides: - files: - '**/spec/**/*' diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9e808cc7a9..21dfd6563e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,7 @@ -image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-10-graphicsmagick-1.3.34" - stages: - sync - prepare + - build-images - fixtures - test - post-test @@ -16,6 +15,7 @@ stages: # in cases where jobs require Docker-in-Docker, the job # definition must be extended with `.use-docker-in-docker` default: + image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.6-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-9.6-graphicsmagick-1.3.34" tags: - gitlab-org # All jobs are interruptible by default @@ -25,10 +25,17 @@ workflow: rules: # If `$FORCE_GITLAB_CI` is set, create a pipeline. - if: '$FORCE_GITLAB_CI' + # As part of the process of creating RCs automatically, we update stable + # branches with the changes of the most recent production deployment. The + # merge requests used for this merge a branch release-tools/X into a stable + # branch. For these merge requests we don't want to run any pipelines, as + # they serve no purpose and will run anyway when the changes are merged. + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME =~ /^release-tools\/\d+\.\d+\.\d+-rc\d+$/ && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^[\d-]+-stable(-ee)?$/ && $CI_PROJECT_PATH == "gitlab-org/gitlab"' + when: never # For merge requests, create a pipeline. - if: '$CI_MERGE_REQUEST_IID' # For `master` branch, create a pipeline (this includes on schedules, pushes, merges, etc.). - - if: '$CI_COMMIT_BRANCH == "master"' + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' # For tags, create a pipeline. - if: '$CI_COMMIT_TAG' # If `$GITLAB_INTERNAL` isn't set, don't create a pipeline. diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index 28ad2b4192..e71e74fd4d 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -7,8 +7,12 @@ *.rake @gitlab-org/maintainers/rails-backend # Technical writing team are the default reviewers for all markdown docs -*.md @gl-docsteam /doc/ @gl-docsteam +# Dev and Doc guidelines +/doc/development/ @marcia @mjang1 +/doc/development/documentation/ @mikelewis +/doc/ci @marcel.amirault @sselhorn +/doc/.linting @marcel.amirault @eread @aqualls @mikelewis # Frontend maintainers should see everything in `app/assets/` *.scss @annabeldunstone @gitlab-org/maintainers/frontend @@ -33,7 +37,7 @@ /ee/app/finders/ @gitlab-org/maintainers/database # Feature specific owners -/ee/lib/gitlab/code_owners/ @reprazent +/ee/lib/gitlab/code_owners/ @reprazent @kerrizor /ee/lib/ee/gitlab/auth/ldap/ @dblessing @mkozono /lib/gitlab/auth/ldap/ @dblessing @mkozono /lib/gitlab/ci/templates/ @nolith @zj diff --git a/.gitlab/ci/cache-repo.gitlab-ci.yml b/.gitlab/ci/cache-repo.gitlab-ci.yml index ecbed0ed6c..a091785dec 100644 --- a/.gitlab/ci/cache-repo.gitlab-ci.yml +++ b/.gitlab/ci/cache-repo.gitlab-ci.yml @@ -21,7 +21,6 @@ cache-repo: extends: .cache-repo:rules image: gcr.io/google.com/cloudsdktool/cloud-sdk:alpine stage: sync - allow_failure: true variables: GIT_STRATEGY: none TAR_FILENAME: /tmp/gitlab-master.tar diff --git a/.gitlab/ci/cng.gitlab-ci.yml b/.gitlab/ci/cng.gitlab-ci.yml index 2450e34656..d7699de74e 100644 --- a/.gitlab/ci/cng.gitlab-ci.yml +++ b/.gitlab/ci/cng.gitlab-ci.yml @@ -3,7 +3,6 @@ cloud-native-image: image: ruby:2.6-alpine dependencies: [] stage: post-test - allow_failure: true variables: GIT_DEPTH: "1" script: diff --git a/.gitlab/ci/dev-fixtures.gitlab-ci.yml b/.gitlab/ci/dev-fixtures.gitlab-ci.yml index 27ceb6f37d..fc3678a7d1 100644 --- a/.gitlab/ci/dev-fixtures.gitlab-ci.yml +++ b/.gitlab/ci/dev-fixtures.gitlab-ci.yml @@ -1,11 +1,11 @@ .run-dev-fixtures: extends: - .default-retry - - .default-cache + - .rails-cache - .default-before_script - .use-pg11 stage: test - needs: ["setup-test-env pg11"] + needs: ["setup-test-env"] variables: FIXTURE_PATH: "db/fixtures/development" SEED_CYCLE_ANALYTICS: "true" @@ -19,8 +19,9 @@ run-dev-fixtures: - .run-dev-fixtures - .dev-fixtures:rules:ee-and-foss script: - - scripts/gitaly-test-spawn - - RAILS_ENV=test bundle exec rake db:seed_fu + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" + - run_timed_command "RAILS_ENV=test bundle exec rake db:seed_fu" run-dev-fixtures-ee: extends: @@ -28,6 +29,7 @@ run-dev-fixtures-ee: - .dev-fixtures:rules:ee-only - .use-pg11-ee script: - - scripts/gitaly-test-spawn + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" - cp ee/db/fixtures/development/* $FIXTURE_PATH - - RAILS_ENV=test bundle exec rake db:seed_fu + - run_timed_command "RAILS_ENV=test bundle exec rake db:seed_fu" diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml index b8a66decbb..50dbef4459 100644 --- a/.gitlab/ci/docs.gitlab-ci.yml +++ b/.gitlab/ci/docs.gitlab-ci.yml @@ -2,7 +2,6 @@ extends: - .default-retry - .docs:rules:review-docs - allow_failure: true image: ruby:2.6-alpine stage: review dependencies: [] @@ -68,7 +67,7 @@ graphql-reference-verify: - .docs:rules:graphql-reference-verify - .use-pg11 stage: test - needs: ["setup-test-env pg11"] + needs: ["setup-test-env"] script: - bundle exec rake gitlab:graphql:check_docs - bundle exec rake gitlab:graphql:check_schema diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml index 2b22162b0c..6e9119f295 100644 --- a/.gitlab/ci/frontend.gitlab-ci.yml +++ b/.gitlab/ci/frontend.gitlab-ci.yml @@ -15,8 +15,7 @@ - .default-retry - .default-before_script - .assets-compile-cache - - .use-docker-in-docker - image: registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-graphicsmagick-1.3.34-docker-19.03.1 + image: registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.6-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-graphicsmagick-1.3.34-docker-19.03.1 stage: prepare variables: NODE_ENV: "production" @@ -34,20 +33,16 @@ paths: - webpack-report/ - assets-compile.log - # We consume these files in GitLab UI for integration tests: - # https://gitlab.com/gitlab-org/gitlab-ui/-/blob/e88493b3c855aea30bf60baee692a64606b0eb1e/.storybook/preview-head.pug#L1 - - public/assets/application-*.css - - public/assets/application-*.css.gz + # These assets are used in multiple locations: + # - in `build-assets-image` job to create assets image for packaging systems + # - GitLab UI for integration tests: https://gitlab.com/gitlab-org/gitlab-ui/-/blob/e88493b3c855aea30bf60baee692a64606b0eb1e/.storybook/preview-head.pug#L1 + - public/assets when: always script: - node --version - retry yarn install --frozen-lockfile --production --cache-folder .yarn-cache --prefer-offline - free -m - time bin/rake gitlab:assets:compile > assets-compile.log 2>&1 - # TODO: Change the image tag to be the MD5 of assets files and skip image building if the image exists - # We'll also need to pass GITLAB_ASSETS_TAG to the trigerred omnibus-gitlab pipeline similarly to how we do it for trigerred CNG pipelines - # https://gitlab.com/gitlab-org/gitlab/issues/208389 - - time scripts/build_assets_image - scripts/clean-old-cached-assets - rm -f /etc/apt/sources.list.d/google*.list # We don't need to update Chrome here @@ -65,6 +60,20 @@ gitlab:assets:compile pull-cache: cache: policy: pull +build-assets-image: + extends: + - .use-kaniko + - .frontend:rules:gitlab-assets-compile-pull-cache + stage: build-images + needs: ["gitlab:assets:compile pull-cache"] + variables: + GIT_DEPTH: "1" + script: + # TODO: Change the image tag to be the MD5 of assets files and skip image building if the image exists + # We'll also need to pass GITLAB_ASSETS_TAG to the trigerred omnibus-gitlab pipeline similarly to how we do it for trigerred CNG pipelines + # https://gitlab.com/gitlab-org/gitlab/issues/208389 + - scripts/build_assets_image + .compile-assets-metadata: extends: - .default-retry @@ -127,16 +136,15 @@ compile-assets pull-cache as-if-foss: .frontend-fixtures-base: extends: - .default-retry - - .default-cache + - .rails-cache - .default-before_script - .use-pg11 stage: fixtures - needs: ["setup-test-env pg11", "compile-assets pull-cache"] + needs: ["setup-test-env", "compile-assets pull-cache"] script: - - date - - scripts/gitaly-test-spawn - - date - - bundle exec rake frontend:fixtures + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" + - run_timed_command "bundle exec rake frontend:fixtures" artifacts: name: frontend-fixtures expire_in: 31d @@ -154,7 +162,7 @@ frontend-fixtures: frontend-fixtures-as-if-foss: extends: - .frontend-fixtures-base - - .frontend:rules:default-frontend-jobs-no-foss + - .frontend:rules:default-frontend-jobs-as-if-foss - .as-if-foss .frontend-job-base: @@ -197,7 +205,7 @@ karma: karma-as-if-foss: extends: - .karma-base - - .frontend:rules:default-frontend-jobs-no-foss + - .frontend:rules:default-frontend-jobs-as-if-foss - .as-if-foss needs: ["frontend-fixtures-as-if-foss"] @@ -229,10 +237,24 @@ jest: junit: junit_jest.xml parallel: 2 +jest-integration: + extends: + - .frontend-job-base + - .frontend:rules:default-frontend-jobs + script: + - date + - yarn jest:integration --ci + needs: ["frontend-fixtures"] + cache: + key: jest-integration + paths: + - tmp/cache/jest/ + policy: pull-push + jest-as-if-foss: extends: - .jest-base - - .frontend:rules:default-frontend-jobs-no-foss + - .frontend:rules:default-frontend-jobs-as-if-foss - .as-if-foss needs: ["frontend-fixtures-as-if-foss"] cache: @@ -241,11 +263,13 @@ jest-as-if-foss: coverage-frontend: extends: - .default-retry - - .frontend:rules:default-frontend-jobs-no-foss + - .yarn-cache + - .frontend:rules:ee-mr-and-master-only needs: ["jest"] stage: post-test before_script: - - yarn install --frozen-lockfile --cache-folder .yarn-cache --prefer-offline + - source scripts/utils.sh + - retry yarn install --frozen-lockfile script: - yarn node scripts/frontend/merge_coverage_frontend.js artifacts: @@ -254,8 +278,7 @@ coverage-frontend: paths: - coverage-frontend/ cache: - paths: - - .yarn-cache/ + policy: pull .qa-frontend-node: extends: @@ -279,22 +302,32 @@ qa-frontend-node:10: image: node:dubnium qa-frontend-node:latest: - extends: .qa-frontend-node + extends: + - .qa-frontend-node + - .frontend:rules:qa-frontend-node-latest image: node:latest - allow_failure: true webpack-dev-server: extends: - .default-retry - - .default-cache - .frontend:rules:default-frontend-jobs stage: test - needs: ["setup-test-env pg11", "compile-assets pull-cache"] + needs: [] variables: WEBPACK_MEMORY_TEST: "true" WEBPACK_VENDOR_DLL: "true" + cache: + key: + files: + - yarn.lock + prefix: "v1" + paths: + - node_modules/ + - tmp/cache/webpack-dlls/ script: - - yarn webpack-vendor + - source scripts/utils.sh + - retry yarn install --frozen-lockfile + - retry yarn webpack-vendor - node --expose-gc node_modules/.bin/webpack-dev-server --config config/webpack.config.js artifacts: name: webpack-dev-server diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml index 66b7c47efc..e6619ff2b6 100644 --- a/.gitlab/ci/global.gitlab-ci.yml +++ b/.gitlab/ci/global.gitlab-ci.yml @@ -21,7 +21,7 @@ # Jobs that only need to pull cache .default-cache: cache: - key: "debian-stretch-ruby-2.6.5-pg11-node-12.x" + key: "debian-stretch-ruby-2.6.6-pg11-node-12.x" paths: - .go/pkg/mod - vendor/ruby @@ -29,65 +29,39 @@ - vendor/gitaly-ruby policy: pull -.use-pg9: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-9.6-graphicsmagick-1.3.34" - services: - - name: postgres:9.6.17 - command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:alpine - variables: - POSTGRES_HOST_AUTH_METHOD: trust +.rails-cache: cache: - key: "debian-stretch-ruby-2.6.5-pg9-node-12.x" + key: + files: + - Gemfile.lock + - GITALY_SERVER_VERSION + prefix: "ruby-go-cache-v1" + paths: + - vendor/ruby + - vendor/gitaly-ruby + - .go/pkg/mod + policy: pull -.use-pg10: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-10-graphicsmagick-1.3.34" - services: - - name: postgres:10.12 - command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:alpine - variables: - POSTGRES_HOST_AUTH_METHOD: trust +.yarn-cache: cache: - key: "debian-stretch-ruby-2.6.5-pg10-node-12.x" + key: + files: + - yarn.lock + prefix: "v1" + paths: + - node_modules/ .use-pg11: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-11-graphicsmagick-1.3.34" + image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.6-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-11-graphicsmagick-1.3.34" services: - name: postgres:11.6 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - name: redis:alpine variables: POSTGRES_HOST_AUTH_METHOD: trust - cache: - key: "debian-stretch-ruby-2.6.5-pg11-node-12.x" - -.use-pg9-ee: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-9.6-graphicsmagick-1.3.34" - services: - - name: postgres:9.6.17 - command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:alpine - - name: elasticsearch:6.4.2 - variables: - POSTGRES_HOST_AUTH_METHOD: trust - cache: - key: "debian-stretch-ruby-2.6.5-pg9-node-12.x" - -.use-pg10-ee: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-10-graphicsmagick-1.3.34" - services: - - name: postgres:10.12 - command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:alpine - - name: elasticsearch:6.4.2 - variables: - POSTGRES_HOST_AUTH_METHOD: trust - cache: - key: "debian-stretch-ruby-2.6.5-pg10-node-12.x" .use-pg11-ee: - image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.5-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-11-graphicsmagick-1.3.34" + image: "registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.6-golang-1.14-git-2.26-lfs-2.9-chrome-73.0-node-12.x-yarn-1.21-postgresql-11-graphicsmagick-1.3.34" services: - name: postgres:11.6 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] @@ -95,15 +69,13 @@ - name: elasticsearch:6.4.2 variables: POSTGRES_HOST_AUTH_METHOD: trust - cache: - key: "debian-stretch-ruby-2.6.5-pg11-node-12.x" -# Pin kaniko to v0.16.0 due to https://github.com/GoogleContainerTools/kaniko/issues/1162 .use-kaniko: image: - name: gcr.io/kaniko-project/executor:debug-v0.16.0 + name: gcr.io/kaniko-project/executor:debug-v0.20.0 entrypoint: [""] before_script: + - mkdir -p /kaniko/.docker - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json .as-if-foss: diff --git a/.gitlab/ci/memory.gitlab-ci.yml b/.gitlab/ci/memory.gitlab-ci.yml index af75ff257e..79dfc88d13 100644 --- a/.gitlab/ci/memory.gitlab-ci.yml +++ b/.gitlab/ci/memory.gitlab-ci.yml @@ -8,7 +8,7 @@ memory-static: extends: .only-code-memory-job-base stage: test - needs: ["setup-test-env pg11"] + needs: ["setup-test-env"] variables: SETUP_DB: "false" script: @@ -28,6 +28,7 @@ memory-static: - tmp/memory_*.txt reports: metrics: tmp/memory_metrics.txt + expire_in: 31d # Show memory usage caused by invoking require per gem. # Unlike `memory-static`, it hits the app with one request to ensure that any last minute require-s have been called. @@ -38,7 +39,7 @@ memory-on-boot: - .only-code-memory-job-base - .use-pg11 stage: test - needs: ["setup-test-env pg11", "compile-assets pull-cache"] + needs: ["setup-test-env", "compile-assets pull-cache"] variables: NODE_ENV: "production" RAILS_ENV: "production" @@ -54,3 +55,4 @@ memory-on-boot: - tmp/memory_*.txt reports: metrics: tmp/memory_on_boot_metrics.txt + expire_in: 31d diff --git a/.gitlab/ci/pages.gitlab-ci.yml b/.gitlab/ci/pages.gitlab-ci.yml index 38d79ddb09..218ec7043d 100644 --- a/.gitlab/ci/pages.gitlab-ci.yml +++ b/.gitlab/ci/pages.gitlab-ci.yml @@ -15,3 +15,4 @@ pages: artifacts: paths: - public + expire_in: 31d diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml index 8a8f66a464..40ef13dd92 100644 --- a/.gitlab/ci/qa.gitlab-ci.yml +++ b/.gitlab/ci/qa.gitlab-ci.yml @@ -23,7 +23,7 @@ qa:internal: qa:internal-as-if-foss: extends: - .qa-job-base - - .qa:rules:ee-only + - .qa:rules:as-if-foss - .as-if-foss script: - bundle exec rspec @@ -38,7 +38,7 @@ qa:selectors: qa:selectors-as-if-foss: extends: - qa:selectors - - .qa:rules:ee-only + - .qa:rules:as-if-foss - .as-if-foss .package-and-qa-base: @@ -58,6 +58,5 @@ package-and-qa: needs: - job: build-qa-image artifacts: false - - job: gitlab:assets:compile pull-cache + - job: build-assets-image artifacts: false - allow_failure: true diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 28ec96b838..e8087aebce 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -1,48 +1,43 @@ .rails:needs:setup-and-assets: - needs: ["setup-test-env pg11", "compile-assets pull-cache"] + needs: ["setup-test-env", "compile-assets pull-cache"] .rails-job-base: extends: - .default-retry - - .default-cache - .default-before_script + - .rails-cache -#################### -# EE and FOSS jobs # -.base-setup-test-env: +####################################################### +# EE/FOSS: default refs (MRs, master, schedules) jobs # +setup-test-env: extends: - .rails-job-base + - .rails:rules:default-refs-code-backstage-qa + - .use-pg11 stage: prepare + variables: + GITLAB_TEST_EAGER_LOAD: "0" script: - - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init' - - scripts/gitaly-test-build # Do not use 'bundle exec' here + - run_timed_command "bundle exec ruby -I. -e 'require \"config/environment\"; TestEnv.init'" + - run_timed_command "scripts/gitaly-test-build" # Do not use 'bundle exec' here + - rm tmp/tests/gitaly/.ruby-bundle # This file prevents gems from being installed even if vendor/gitaly-ruby is missing artifacts: expire_in: 7d paths: - - tmp/tests - config/secrets.yml - - vendor/gitaly-ruby + - tmp/tests/gitaly + - tmp/tests/gitlab-elasticsearch-indexer + - tmp/tests/gitlab-shell + - tmp/tests/gitlab-test-fork + - tmp/tests/gitlab-test-fork_bare + - tmp/tests/gitlab-test + - tmp/tests/gitlab-workhorse + - tmp/tests/repositories + - tmp/tests/second_storage + when: always cache: policy: pull-push -setup-test-env pg11: - extends: - - .base-setup-test-env - - .rails:rules:default-refs-code-backstage-qa - - .use-pg11 - -setup-test-env pg10: - extends: - - .base-setup-test-env - - .rails:rules:master-refs-code-backstage - - .use-pg10 - -setup-test-env pg9: - extends: - - .base-setup-test-env - - .rails:rules:nightly-master-refs-code-backstage - - .use-pg9 - static-analysis: extends: - .rails-job-base @@ -55,7 +50,7 @@ static-analysis: script: - scripts/static-analysis cache: - key: "ruby-2.6.5-pg11-rubocop" + key: "ruby-2.6.6-pg11-rubocop" paths: - vendor/ruby - tmp/rubocop_cache @@ -64,8 +59,8 @@ static-analysis: downtime_check: extends: - .rails-job-base - - .rails:needs:setup-and-assets - .rails:rules:downtime_check + needs: ["setup-test-env"] stage: test variables: SETUP_DB: "false" @@ -75,8 +70,10 @@ downtime_check: .rspec-base: extends: .rails-job-base stage: test - needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache"] + needs: ["setup-test-env", "retrieve-tests-metadata", "compile-assets pull-cache"] script: + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" - source scripts/rspec_helpers.sh - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag ~level:migration" artifacts: @@ -89,7 +86,7 @@ downtime_check: - rspec_profiling/ - tmp/capybara/ - tmp/memory_test/ - - junit_rspec.xml + - log/*.log reports: junit: junit_rspec.xml @@ -101,6 +98,8 @@ downtime_check: .rspec-base-migration: script: + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" - source scripts/rspec_helpers.sh - rspec_paralellized_job "--tag ~quarantine --tag ~geo --tag level:migration" @@ -133,7 +132,7 @@ rspec fast_spec_helper: - .rails:rules:ee-and-foss - .use-pg11 stage: test - needs: ["setup-test-env pg11"] + needs: ["setup-test-env"] db:migrate:reset: extends: .db-job-base @@ -141,28 +140,28 @@ db:migrate:reset: - bundle exec rake db:migrate:reset db:check-schema: - extends: .db-job-base + extends: + - .db-job-base + - .rails:rules:ee-mr-and-master-only script: - source scripts/schema_changed.sh -db:migrate-from-v11.11.0: +db:migrate-from-v12.10.0: extends: .db-job-base variables: SETUP_DB: "false" script: - - export PROJECT_TO_CHECKOUT="gitlab-foss" - - export TAG_TO_CHECKOUT="v11.11.0" - - '[[ ! -d "ee/" ]] || export PROJECT_TO_CHECKOUT="gitlab"' - - '[[ ! -d "ee/" ]] || export TAG_TO_CHECKOUT="v11.11.0-ee"' + - export PROJECT_TO_CHECKOUT="gitlab" + - export TAG_TO_CHECKOUT="v12.10.0-ee" + - '[[ -d "ee/" ]] || export PROJECT_TO_CHECKOUT="gitlab-foss"' + - '[[ -d "ee/" ]] || export TAG_TO_CHECKOUT="v12.10.0"' - git fetch https://gitlab.com/gitlab-org/$PROJECT_TO_CHECKOUT.git $TAG_TO_CHECKOUT - 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 - bundle update google-protobuf grpc bootsnap - bundle install $BUNDLE_INSTALL_FLAGS - date - cp config/gitlab.yml.example config/gitlab.yml - - bundle exec rake db:drop db:create db:schema:load db:seed_fu + - bundle exec rake db:drop db:create db:structure:load db:seed_fu - date - git checkout -f $CI_COMMIT_SHA - bundle install $BUNDLE_INSTALL_FLAGS @@ -186,23 +185,24 @@ gitlab:setup: # db/fixtures/development/04_project.rb thanks to SIZE=1 below - git clone https://gitlab.com/gitlab-org/gitlab-test.git /home/git/repositories/gitlab-org/gitlab-test.git - - scripts/gitaly-test-spawn + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" - force=yes SIZE=1 FIXTURE_PATH="db/fixtures/development" bundle exec rake gitlab:setup artifacts: when: on_failure expire_in: 1d paths: - - log/development.log + - log/*.log rspec:coverage: extends: - .rails-job-base - - .rails:rules:ee-only + - .rails:rules:ee-mr-and-master-only stage: post-test # We cannot use needs since it would mean needing 84 jobs (since most are parallelized) # so we use `dependencies` here. dependencies: - - setup-test-env pg11 + - setup-test-env - rspec migration pg11 - rspec unit pg11 - rspec integration pg11 @@ -231,104 +231,11 @@ rspec:coverage: - coverage/index.html - coverage/assets/ - tmp/memory_test/ -# EE and FOSS jobs # -#################### +# EE/FOSS: default refs (MRs, master, schedules) jobs # +####################################################### -#################### -# master-only jobs # -.rspec-base-pg10: - extends: - - .rspec-base - - .rails:rules:master-refs-code-backstage - - .use-pg10 - needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] - -rspec migration pg10: - extends: - - .rspec-base-pg10 - - .rspec-base-migration - parallel: 5 - -rspec unit pg10: - extends: .rspec-base-pg10 - parallel: 20 - -rspec integration pg10: - extends: .rspec-base-pg10 - parallel: 8 - -rspec system pg10: - extends: .rspec-base-pg10 - parallel: 24 -# master-only jobs # -#################### - -###################### -# nightly-only jobs # -.rspec-base-pg9: - extends: - - .rspec-base - - .rails:rules:nightly-master-refs-code-backstage - - .use-pg9 - needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache"] - -rspec migration pg9: - extends: - - .rspec-base-pg9 - - .rspec-base-migration - parallel: 5 - -rspec unit pg9: - extends: .rspec-base-pg9 - parallel: 20 - -rspec integration pg9: - extends: .rspec-base-pg9 - parallel: 8 - -rspec system pg9: - extends: .rspec-base-pg9 - parallel: 24 -# nightly-only jobs # -##################### - -####################### -# EE master-only jobs # -.rspec-ee-base-pg10: - extends: - - .rspec-base-ee - - .use-pg10-ee - needs: ["setup-test-env pg10", "retrieve-tests-metadata", "compile-assets pull-cache"] - -rspec-ee migration pg10: - extends: - - .rspec-ee-base-pg10 - - .rspec-base-migration - - .rails:rules:master-refs-code-backstage - parallel: 2 - -rspec-ee unit pg10: - extends: - - .rspec-ee-base-pg10 - - .rails:rules:master-refs-code-backstage - parallel: 10 - -rspec-ee integration pg10: - extends: - - .rspec-ee-base-pg10 - - .rails:rules:master-refs-code-backstage - parallel: 4 - -rspec-ee system pg10: - extends: - - .rspec-ee-base-pg10 - - .rails:rules:master-refs-code-backstage - parallel: 6 -# EE master-only jobs # -####################### - -################ -# EE-only jobs # +################################################## +# EE: default refs (MRs, master, schedules) jobs # .rspec-base-ee: extends: - .rspec-base @@ -336,10 +243,11 @@ rspec-ee system pg10: .rspec-base-pg11-as-if-foss: extends: - - .rspec-base-ee + - .rspec-base + - .rails:rules:as-if-foss - .as-if-foss - .use-pg11 - needs: ["setup-test-env pg11", "retrieve-tests-metadata", "compile-assets pull-cache as-if-foss"] + needs: ["setup-test-env", "retrieve-tests-metadata", "compile-assets pull-cache as-if-foss"] .rspec-ee-base-pg11: extends: @@ -385,6 +293,8 @@ rspec-ee system pg11: .rspec-ee-base-geo: extends: .rspec-base-ee script: + - run_timed_command "scripts/gitaly-test-build" + - run_timed_command "scripts/gitaly-test-spawn" - source scripts/rspec_helpers.sh - scripts/prepare_postgres_fdw.sh - rspec_paralellized_job "--tag ~quarantine --tag geo" @@ -411,26 +321,5 @@ db:rollback geo: script: - bundle exec rake geo:db:migrate VERSION=20170627195211 - bundle exec rake geo:db:migrate -# EE-only jobs # -################ - -######################## -# EE nightly-only jobs # -.rspec-ee-base-geo-pg9: - extends: - - .rspec-ee-base-geo - - .use-pg9-ee - - .rails:rules:nightly-master-refs-code-backstage-ee-only - needs: ["setup-test-env pg9", "retrieve-tests-metadata", "compile-assets pull-cache"] - -rspec-ee unit pg9 geo: - extends: .rspec-ee-base-geo-pg9 - parallel: 2 - -rspec-ee integration pg9 geo: - extends: .rspec-ee-base-geo-pg9 - -rspec-ee system pg9 geo: - extends: .rspec-ee-base-geo-pg9 -# EE nightly-only jobs # -######################## +# EE: default refs (MRs, master, schedules) jobs # +################################################## diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml index 61915aa798..153334e1af 100644 --- a/.gitlab/ci/reports.gitlab-ci.yml +++ b/.gitlab/ci/reports.gitlab-ci.yml @@ -14,11 +14,7 @@ code_quality: - .use-docker-in-docker stage: test needs: [] - allow_failure: true variables: - # emptying DOCKER_HOST so it can be detected properly on kubernetes executor - # with the script below - DOCKER_HOST: "" CODE_QUALITY_IMAGE: "registry.gitlab.com/gitlab-org/ci-cd/codequality:0.85.9" script: - | @@ -47,12 +43,10 @@ code_quality: extends: - .default-retry - .reports:rules:sast - - .use-docker-in-docker stage: test # `needs: []` starts the job immediately in the pipeline # https://docs.gitlab.com/ee/ci/yaml/README.html#needs needs: [] - allow_failure: true artifacts: paths: - gl-sast-report.json # GitLab-specific @@ -60,10 +54,6 @@ code_quality: sast: gl-sast-report.json expire_in: 1 week # GitLab-specific variables: - # emptying DOCKER_HOST so it can be detected properly on kubernetes executor - # with the script below - DOCKER_HOST: "" - DOCKER_DRIVER: overlay2 DOCKER_TLS_CERTDIR: "" SAST_ANALYZER_IMAGE_PREFIX: "registry.gitlab.com/gitlab-org/security-products/analyzers" SAST_ANALYZER_IMAGE_TAG: 2 @@ -82,15 +72,11 @@ eslint-sast: image: name: "$SAST_ANALYZER_IMAGE_PREFIX/eslint:$SAST_ANALYZER_IMAGE_TAG" -kubesec-sast: - extends: .sast - image: - name: "$SAST_ANALYZER_IMAGE_PREFIX/kubesec:$SAST_ANALYZER_IMAGE_TAG" - -nodejs-scan-sast: - extends: .sast - image: - name: "$SAST_ANALYZER_IMAGE_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG" +# Temporary disabled as it's constantly failing. See https://gitlab.com/gitlab-org/gitlab/-/issues/213769. +# nodejs-scan-sast: +# extends: .sast +# image: +# name: "$SAST_ANALYZER_IMAGE_PREFIX/nodejs-scan:$SAST_ANALYZER_IMAGE_TAG" secrets-sast: extends: .sast @@ -108,11 +94,7 @@ dependency_scanning: stage: test needs: [] variables: - # emptying DOCKER_HOST so it can be detected properly on kubernetes executor - # with the script below - DOCKER_HOST: "" DS_EXCLUDED_PATHS: "qa/qa/ee/fixtures/secure_premade_reports,spec,ee/spec" # GitLab-specific - allow_failure: true script: - export DS_VERSION=${SP_VERSION:-$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')} - | @@ -183,7 +165,6 @@ dast: # DAST_USERNAME_FIELD: "user[login]" # DAST_PASSWORD_FIELD: "user[passowrd]" DAST_VERSION: 1 - allow_failure: true script: - 'export DAST_WEBSITE="${DAST_WEBSITE:-$(cat environment_url.txt)}"' # To be done in a later iteration diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml index 06710b3b9d..46a281cd48 100644 --- a/.gitlab/ci/review.gitlab-ci.yml +++ b/.gitlab/ci/review.gitlab-ci.yml @@ -1,70 +1,36 @@ -.review-docker: - extends: - - .default-retry - - .use-docker-in-docker - image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.6 - variables: - GITLAB_EDITION: "ce" - build-qa-image: extends: - .use-kaniko - .default-retry - - .review:rules:mr-and-schedule-auto - stage: prepare + - .review:rules:build-qa-image + stage: build-images + needs: [] script: - - '[[ ! -d "ee/" ]] || export GITLAB_EDITION="ee"' - - export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-${GITLAB_EDITION}-qa:${CI_COMMIT_REF_SLUG}" + - export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_REF_SLUG}" - /kaniko/executor --context=${CI_PROJECT_DIR} --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile --destination=${QA_IMAGE} --cache=true -.review-cleanup-base: +review-cleanup: extends: - .default-retry - .review:rules:review-cleanup + image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14 stage: prepare - allow_failure: true environment: name: review/auto-cleanup action: stop before_script: - source scripts/utils.sh + - source scripts/review_apps/gcp_cleanup.sh - install_gitlab_gem + - setup_gcp_dependencies script: - ruby -rrubygems scripts/review_apps/automated_cleanup.rb - -review-cleanup: - extends: - - .review-cleanup-base - image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-charts-build-base - -review-cleanup-helm3: - extends: - - .review-cleanup-base - variables: - HELM_3: 1 - image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3-kubectl1.14 - -review-gcp-cleanup: - extends: - - .review:rules:review-gcp-cleanup - stage: prepare - image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest - allow_failure: true - environment: - name: review/auto-gcp-cleanup - action: stop - before_script: - - gcloud auth activate-service-account --key-file=$REVIEW_APPS_GCP_CREDENTIALS - - gcloud config set project $REVIEW_APPS_GCP_PROJECT - - apt-get install -y jq - - source scripts/review_apps/gcp_cleanup.sh - script: - gcp_cleanup review-build-cng: extends: - .default-retry - - .review:rules:mr-and-schedule-auto-if-frontend-manual-otherwise + - .review:rules:review-build-cng image: ruby:2.6-alpine stage: review-prepare before_script: @@ -87,8 +53,7 @@ review-build-cng: variables: HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}" DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}" - GITLAB_HELM_CHART_REF: "v3.2.2" - GITLAB_EDITION: "ce" + GITLAB_HELM_CHART_REF: "v3.3.3" environment: name: review/${CI_COMMIT_REF_NAME} url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN} @@ -102,9 +67,7 @@ review-deploy: stage: review dependencies: [] resource_group: "review/${CI_COMMIT_REF_NAME}" - allow_failure: true before_script: - - '[[ ! -d "ee/" ]] || export GITLAB_EDITION="ee"' - export GITLAB_SHELL_VERSION=$( + ### Problem to solve @@ -10,33 +10,44 @@ Personas are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/ -* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager) +* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#cameron-compliance-manager) * [Parker (Product Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#parker-product-manager) * [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead) -* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer) * [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer) +* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer) * [Devon (DevOps Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#devon-devops-engineer) * [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator) * [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst) -* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst) +* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager) +* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer) * [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test) -* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops) --> +* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops) +* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) +* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst) +--> -### Further details +### User experience goal + + - ### Proposal +### Further details + + + ### Permissions and Security ### Documentation - diff --git a/.gitlab/issue_templates/Productivity Improvement.md b/.gitlab/issue_templates/Productivity Improvement.md index 79e1461392..974f11f6da 100644 --- a/.gitlab/issue_templates/Productivity Improvement.md +++ b/.gitlab/issue_templates/Productivity Improvement.md @@ -1,7 +1,7 @@ -## What is the productivity problem to solve? +## What is the GitLab engineering productivity problem to solve? @@ -37,4 +37,3 @@ after the implementation is merged/deployed/released. - Otherwise, create a new "Productivity Improvement" issue. You can re-use the description from this issue, but obviously another solution should be chosen this time. /label ~"Engineering Productivity" ~meta -/cc @gl-quality/eng-prod diff --git a/.gitlab/issue_templates/Security developer workflow.md b/.gitlab/issue_templates/Security developer workflow.md index 2c80360d32..695f0167ad 100644 --- a/.gitlab/issue_templates/Security developer workflow.md +++ b/.gitlab/issue_templates/Security developer workflow.md @@ -36,7 +36,8 @@ After your merge request has been approved according to our [approval guidelines ## Documentation and final details - [ ] Ensure the [Links section](#links) is completed. -- [ ] Find out the versions affected (the Git history of the files affected may help you with this) and add them to the [details section](#details) +- [ ] Add the GitLab [versions](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/security/developer.md#versions-affected) and editions affected to the [details section](#details) + * The Git history of the files affected may help you associate the issue with a [release](https://about.gitlab.com/releases/) - [ ] Fill in any upgrade notes that users may need to take into account in the [details section](#details) - [ ] Add Yes/No and further details if needed to the migration and settings columns in the [details section](#details) - [ ] Add the nickname of the external user who found the issue (and/or HackerOne profile) to the Thanks row in the [details section](#details) @@ -56,6 +57,7 @@ After your merge request has been approved according to our [approval guidelines | Description | Details | Further details| | -------- | -------- | -------- | | Versions affected | X.Y | | +| GitLab EE only | Yes/No | | | Upgrade notes | | | | GitLab Settings updated | Yes/No| | | Migration required | Yes/No | | diff --git a/.gitlab/issue_templates/Technical Evaluation.md b/.gitlab/issue_templates/Technical Evaluation.md index f603d88a76..533a134382 100644 --- a/.gitlab/issue_templates/Technical Evaluation.md +++ b/.gitlab/issue_templates/Technical Evaluation.md @@ -7,7 +7,7 @@ ### Tasks to Evaluate - + - [ ] Determine feasibility of the feature - [ ] Create issue for implementation or update existing implementation issue description with implementation proposal @@ -18,7 +18,7 @@ ### Risks and Implementation Considerations - + ### Team diff --git a/.gitlab/merge_request_templates/Documentation.md b/.gitlab/merge_request_templates/Documentation.md index 901228ee77..72bfd2cdec 100644 --- a/.gitlab/merge_request_templates/Documentation.md +++ b/.gitlab/merge_request_templates/Documentation.md @@ -13,12 +13,25 @@ -## Author's checklist +## Author's checklist (required) - [ ] Follow the [Documentation Guidelines](https://docs.gitlab.com/ee/development/documentation/) and [Style Guide](https://docs.gitlab.com/ee/development/documentation/styleguide.html). -- [ ] If applicable, update the [permissions table](https://docs.gitlab.com/ee/user/permissions.html). +- If you have `developer` access or higher (for example, GitLab team members or [Core Team](https://about.gitlab.com/community/core-team/) members) + - [ ] Apply the ~documentation label, plus: + - The corresponding DevOps stage and group label, if applicable. + - ~"development guidelines" when changing docs under `doc/development/*`, `CONTRIBUTING.md`, or `README.md`. + - ~"development guidelines" and ~"Documentation guidelines" when changing docs under `development/documentation/*`. + - ~"development guidelines" and ~"Description templates (.gitlab/\*)" when creating/updating issue and MR description templates. + - [ ] Assign the [designated Technical Writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments). + +When applicable: + +- [ ] Update the [permissions table](https://docs.gitlab.com/ee/user/permissions.html). - [ ] Link docs to and from the higher-level index page, plus other related docs where helpful. -- [ ] Apply the ~documentation label. +- [ ] Add [GitLab's version history note(s)](https://docs.gitlab.com/ee/development/documentation/styleguide.html#text-for-documentation-requiring-version-text). +- [ ] Add the [product tier badge](https://docs.gitlab.com/ee/development/documentation/styleguide.html#product-badges). +- [ ] Add/update the [feature flag section](https://docs.gitlab.com/ee/development/documentation/feature_flags.html). +- [ ] If you're changing document headings, search `doc/*`, `app/views/*`, and `ee/app/views/*` for old headings replacing with the new ones to [avoid broken anchors](https://docs.gitlab.com/ee/development/documentation/styleguide.html#anchor-links). ## Review checklist @@ -30,7 +43,9 @@ All reviewers can help ensure accuracy, clarity, completeness, and adherence to **2. Technical Writer** -* [ ] Optional: Technical writer review. If not requested for this MR, must be scheduled post-merge. To request for this MR, assign the writer listed for the applicable [DevOps stage](https://about.gitlab.com/handbook/product/categories/#devops-stages). +- [ ] Optional: Technical writer review. If not requested for this MR, must be scheduled post-merge. To request for this MR, assign the writer listed for the applicable [DevOps stage](https://about.gitlab.com/handbook/product/categories/#devops-stages). + - [ ] Add ~"Technical Writing" and `docs::` workflow label. + - [ ] Add ~docs-only when the only files changed are under `doc/*`. **3. Maintainer** diff --git a/.gitlab/merge_request_templates/Security Release.md b/.gitlab/merge_request_templates/Security Release.md index af3839a96a..f852bebae9 100644 --- a/.gitlab/merge_request_templates/Security Release.md +++ b/.gitlab/merge_request_templates/Security Release.md @@ -19,7 +19,7 @@ See [the general developer security release guidelines](https://gitlab.com/gitla - [ ] A [CHANGELOG entry](https://docs.gitlab.com/ee/development/changelog.html) is added without a `merge_request` value, with `type` set to `security` - [ ] Assign to a reviewer and maintainer, per our [Code Review process]. - [ ] For the MR targeting `master`: - - [ ] Ping appsec team member who created the issue and ask for a non-blocking review with `Please review this MR`. + - [ ] Ask for a non-blocking review from the AppSec team member associated to the issue in the [Canonical repository](https://gitlab.com/gitlab-org/gitlab). If you're unsure who to ping, ask on `#sec-appsec` Slack channel. - [ ] Ensure it's approved according to our [Approval Guidelines]. - [ ] Merge request _must not_ close the corresponding security issue, _unless_ it targets `master`. diff --git a/.haml-lint_todo.yml b/.haml-lint_todo.yml index 1417f37f76..a79bba24ed 100644 --- a/.haml-lint_todo.yml +++ b/.haml-lint_todo.yml @@ -1,431 +1,390 @@ # This configuration was generated by # `haml-lint --auto-gen-config` -# on 2020-03-04 13:16:29 +0100 using Haml-Lint version 0.34.0. +# on 2020-04-20 07:11:26 +0000 using Haml-Lint version 0.34.0. # The point is for the user to remove these configuration records # one by one as the lints are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of Haml-Lint, may require this file to be generated again. linters: - # Offense count: 1646 + + # Offense count: 1552 NoPlainNodes: enabled: true exclude: - - 'app/views/admin/abuse_reports/_abuse_report.html.haml' - - 'app/views/admin/abuse_reports/index.html.haml' - - 'app/views/admin/appearances/_form.html.haml' - - 'app/views/admin/application_settings/_abuse.html.haml' - - 'app/views/admin/application_settings/_diff_limits.html.haml' - - 'app/views/admin/application_settings/_gitaly.html.haml' - - 'app/views/admin/application_settings/_influx.html.haml' - - 'app/views/admin/application_settings/_ip_limits.html.haml' - - 'app/views/admin/application_settings/_performance.html.haml' - - 'app/views/admin/application_settings/_plantuml.html.haml' - - 'app/views/admin/application_settings/_prometheus.html.haml' - - 'app/views/admin/application_settings/_realtime.html.haml' - - 'app/views/admin/application_settings/_repository_check.html.haml' - - 'app/views/admin/application_settings/_signin.html.haml' - - 'app/views/admin/application_settings/_signup.html.haml' - - 'app/views/admin/application_settings/_spam.html.haml' - - 'app/views/admin/application_settings/_terminal.html.haml' - - 'app/views/admin/application_settings/_usage.html.haml' - - 'app/views/admin/application_settings/_visibility_and_access.html.haml' - - 'app/views/admin/applications/_delete_form.html.haml' - - 'app/views/admin/applications/_form.html.haml' - - 'app/views/admin/applications/edit.html.haml' - - 'app/views/admin/applications/index.html.haml' - - 'app/views/admin/applications/new.html.haml' - - 'app/views/admin/applications/show.html.haml' - - 'app/views/admin/background_jobs/show.html.haml' - - 'app/views/admin/broadcast_messages/index.html.haml' - - 'app/views/admin/dashboard/index.html.haml' - - 'app/views/admin/deploy_keys/new.html.haml' - - 'app/views/admin/health_check/show.html.haml' - - 'app/views/admin/hook_logs/_index.html.haml' - - 'app/views/admin/hook_logs/show.html.haml' - - 'app/views/admin/hooks/_form.html.haml' - - 'app/views/admin/hooks/edit.html.haml' - - 'app/views/admin/labels/_form.html.haml' - - 'app/views/admin/logs/show.html.haml' - - 'app/views/admin/projects/_projects.html.haml' - - 'app/views/admin/projects/show.html.haml' - - 'app/views/admin/requests_profiles/index.html.haml' - - 'app/views/admin/runners/_runner.html.haml' - - 'app/views/admin/runners/index.html.haml' - - 'app/views/admin/runners/show.html.haml' - - 'app/views/admin/services/_form.html.haml' - - 'app/views/admin/services/index.html.haml' - - 'app/views/admin/spam_logs/_spam_log.html.haml' - - 'app/views/admin/spam_logs/index.html.haml' - - 'app/views/admin/system_info/show.html.haml' - - 'app/views/admin/users/_access_levels.html.haml' - - 'app/views/admin/users/_form.html.haml' - - 'app/views/admin/users/_head.html.haml' - - 'app/views/admin/users/_profile.html.haml' - - 'app/views/admin/users/_projects.html.haml' - - 'app/views/admin/users/new.html.haml' - - 'app/views/admin/users/projects.html.haml' - - 'app/views/admin/users/show.html.haml' - - 'app/views/clusters/clusters/_cluster.html.haml' - - 'app/views/clusters/clusters/_form.html.haml' - - 'app/views/clusters/clusters/_gcp_signup_offer_banner.html.haml' - - 'app/views/clusters/clusters/gcp/_form.html.haml' - - 'app/views/clusters/clusters/new.html.haml' - - 'app/views/dashboard/milestones/index.html.haml' - - 'app/views/dashboard/projects/_blank_state_admin_welcome.html.haml' - - 'app/views/dashboard/projects/_blank_state_welcome.html.haml' - - 'app/views/dashboard/todos/_todo.html.haml' - - 'app/views/dashboard/todos/index.html.haml' - - 'app/views/devise/confirmations/almost_there.haml' - - 'app/views/devise/mailer/_confirmation_instructions_account.html.haml' - - 'app/views/devise/mailer/_confirmation_instructions_secondary.html.haml' - - 'app/views/devise/mailer/email_changed.html.haml' - - 'app/views/devise/mailer/password_change.html.haml' - - 'app/views/devise/mailer/reset_password_instructions.html.haml' - - 'app/views/devise/mailer/unlock_instructions.html.haml' - - 'app/views/devise/passwords/edit.html.haml' - - 'app/views/devise/sessions/_new_base.html.haml' - - 'app/views/devise/sessions/_new_crowd.html.haml' - - 'app/views/devise/sessions/_new_ldap.html.haml' - - 'app/views/devise/sessions/new.html.haml' - - 'app/views/devise/sessions/two_factor.html.haml' - - 'app/views/devise/shared/_omniauth_box.html.haml' - - 'app/views/devise/shared/_sign_in_link.html.haml' - - 'app/views/devise/shared/_tabs_normal.html.haml' - - 'app/views/discussions/_discussion.html.haml' - - 'app/views/discussions/_headline.html.haml' - - 'app/views/discussions/_notes.html.haml' - - 'app/views/doorkeeper/applications/_delete_form.html.haml' - - 'app/views/doorkeeper/authorized_applications/_delete_form.html.haml' - - 'app/views/errors/encoding.html.haml' - - 'app/views/errors/git_not_found.html.haml' - - 'app/views/errors/omniauth_error.html.haml' - - 'app/views/errors/precondition_failed.html.haml' - - 'app/views/events/_commit.html.haml' - - 'app/views/events/_event_push.atom.haml' - - 'app/views/events/event/_push.html.haml' - - 'app/views/groups/_create_chat_team.html.haml' - - 'app/views/groups/_group_admin_settings.html.haml' - - 'app/views/groups/labels/edit.html.haml' - - 'app/views/groups/labels/new.html.haml' - - 'app/views/groups/milestones/edit.html.haml' - - 'app/views/groups/milestones/index.html.haml' - - 'app/views/groups/milestones/new.html.haml' - - 'app/views/groups/projects.html.haml' - - 'app/views/groups/runners/edit.html.haml' - - 'app/views/groups/settings/_advanced.html.haml' - - 'app/views/groups/settings/_lfs.html.haml' - - 'app/views/help/_shortcuts.html.haml' - - 'app/views/help/index.html.haml' - - 'app/views/help/instance_configuration.html.haml' - - 'app/views/help/instance_configuration/_gitlab_ci.html.haml' - - 'app/views/help/instance_configuration/_gitlab_pages.html.haml' - - 'app/views/help/ui.html.haml' - - 'app/views/import/bitbucket/status.html.haml' - - 'app/views/import/bitbucket_server/status.html.haml' - - 'app/views/invites/show.html.haml' - - 'app/views/layouts/_mailer.html.haml' - - 'app/views/layouts/header/_default.html.haml' - - 'app/views/layouts/header/_new_dropdown.haml' - - 'app/views/layouts/mailer/devise.html.haml' - - 'app/views/layouts/notify.html.haml' - - 'app/views/notify/_failed_builds.html.haml' - - 'app/views/notify/_reassigned_issuable_email.html.haml' - - 'app/views/notify/_removal_notification.html.haml' - - 'app/views/notify/_successful_pipeline.html.haml' - - 'app/views/notify/autodevops_disabled_email.html.haml' - - 'app/views/notify/changed_milestone_email.html.haml' - - 'app/views/notify/import_issues_csv_email.html.haml' - - 'app/views/notify/issue_moved_email.html.haml' - - 'app/views/notify/member_access_denied_email.html.haml' - - 'app/views/notify/member_invite_accepted_email.html.haml' - - 'app/views/notify/member_invited_email.html.haml' - - 'app/views/notify/new_gpg_key_email.html.haml' - - 'app/views/notify/new_mention_in_issue_email.html.haml' - - 'app/views/notify/new_ssh_key_email.html.haml' - - 'app/views/notify/new_user_email.html.haml' - - 'app/views/notify/pages_domain_disabled_email.html.haml' - - 'app/views/notify/pages_domain_enabled_email.html.haml' - - 'app/views/notify/pages_domain_verification_failed_email.html.haml' - - 'app/views/notify/pages_domain_verification_succeeded_email.html.haml' - - 'app/views/notify/pipeline_failed_email.html.haml' - - 'app/views/notify/project_was_exported_email.html.haml' - - 'app/views/notify/project_was_moved_email.html.haml' - - 'app/views/notify/project_was_not_exported_email.html.haml' - - 'app/views/notify/push_to_merge_request_email.html.haml' - - 'app/views/notify/remote_mirror_update_failed_email.html.haml' - - 'app/views/notify/removed_milestone_issue_email.html.haml' - - 'app/views/notify/removed_milestone_merge_request_email.html.haml' - - 'app/views/notify/repository_push_email.html.haml' - - 'app/views/profiles/chat_names/_chat_name.html.haml' - - 'app/views/profiles/chat_names/index.html.haml' - - 'app/views/profiles/chat_names/new.html.haml' - - 'app/views/profiles/keys/_key.html.haml' - - 'app/views/profiles/show.html.haml' - - 'app/views/projects/_bitbucket_import_modal.html.haml' - - 'app/views/projects/_customize_workflow.html.haml' - - 'app/views/projects/_deletion_failed.html.haml' - - 'app/views/projects/_fork_suggestion.html.haml' - - 'app/views/projects/_gitlab_import_modal.html.haml' - - 'app/views/projects/_home_panel.html.haml' - - 'app/views/projects/_import_project_pane.html.haml' - - 'app/views/projects/_issuable_by_email.html.haml' - - 'app/views/projects/_md_preview.html.haml' - - 'app/views/projects/_readme.html.haml' - - 'app/views/projects/artifacts/_artifact.html.haml' - - 'app/views/projects/artifacts/_tree_file.html.haml' - - 'app/views/projects/artifacts/browse.html.haml' - - 'app/views/projects/blame/_age_map_legend.html.haml' - - 'app/views/projects/blame/show.html.haml' - - 'app/views/projects/blob/_editor.html.haml' - - 'app/views/projects/blob/_header_content.html.haml' - - 'app/views/projects/blob/_new_dir.html.haml' - - 'app/views/projects/blob/_remove.html.haml' - - 'app/views/projects/blob/_render_error.html.haml' - - 'app/views/projects/blob/_upload.html.haml' - - 'app/views/projects/blob/edit.html.haml' - - 'app/views/projects/blob/new.html.haml' - - 'app/views/projects/blob/preview.html.haml' - - 'app/views/projects/blob/viewers/_empty.html.haml' - - 'app/views/projects/blob/viewers/_stl.html.haml' - - 'app/views/projects/branches/_branch.html.haml' - - 'app/views/projects/branches/_commit.html.haml' - - 'app/views/projects/branches/_delete_protected_modal.html.haml' - - 'app/views/projects/branches/new.html.haml' - - 'app/views/projects/ci/builds/_build.html.haml' - - 'app/views/projects/ci/lints/_create.html.haml' - - 'app/views/projects/commit/_change.html.haml' - - 'app/views/projects/commits/_commit.html.haml' - - 'app/views/projects/commits/_inline_commit.html.haml' - - 'app/views/projects/compare/_form.html.haml' - - 'app/views/projects/compare/index.html.haml' - - 'app/views/projects/cycle_analytics/_empty_stage.html.haml' - - 'app/views/projects/cycle_analytics/_no_access.html.haml' - - 'app/views/projects/cycle_analytics/_overview.html.haml' - - 'app/views/projects/cycle_analytics/show.html.haml' - - 'app/views/projects/deploy_keys/_form.html.haml' - - 'app/views/projects/deploy_keys/_index.html.haml' - - 'app/views/projects/deploy_keys/edit.html.haml' - - 'app/views/projects/deployments/_deployment.html.haml' - - 'app/views/projects/diffs/_file_header.html.haml' - - 'app/views/projects/diffs/_replaced_image_diff.html.haml' - - 'app/views/projects/diffs/_stats.html.haml' - - 'app/views/projects/empty.html.haml' - - 'app/views/projects/environments/show.html.haml' - - 'app/views/projects/forks/error.html.haml' - - 'app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml' - - 'app/views/projects/hook_logs/_index.html.haml' - - 'app/views/projects/hook_logs/show.html.haml' - - 'app/views/projects/hooks/edit.html.haml' - - 'app/views/projects/imports/new.html.haml' - - 'app/views/projects/imports/show.html.haml' - - 'app/views/projects/issues/_issue.html.haml' - - 'app/views/projects/issues/_new_branch.html.haml' - - 'app/views/projects/issues/import_csv/_modal.html.haml' - - 'app/views/projects/issues/show.html.haml' - - 'app/views/projects/jobs/_header.html.haml' - - 'app/views/projects/jobs/_table.html.haml' - - 'app/views/projects/jobs/index.html.haml' - - 'app/views/projects/labels/edit.html.haml' - - 'app/views/projects/labels/new.html.haml' - - 'app/views/projects/mattermosts/_no_teams.html.haml' - - 'app/views/projects/mattermosts/_team_selection.html.haml' - - 'app/views/projects/mattermosts/new.html.haml' - - 'app/views/projects/merge_requests/_commits.html.haml' - - 'app/views/projects/merge_requests/_discussion.html.haml' - - 'app/views/projects/merge_requests/_how_to_merge.html.haml' - - 'app/views/projects/merge_requests/_merge_request.html.haml' - - 'app/views/projects/merge_requests/_mr_title.html.haml' - - 'app/views/projects/merge_requests/conflicts/_commit_stats.html.haml' - - 'app/views/projects/merge_requests/conflicts/_file_actions.html.haml' - - 'app/views/projects/merge_requests/conflicts/_submit_form.html.haml' - - 'app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml' - - 'app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml' - - 'app/views/projects/merge_requests/conflicts/show.html.haml' - - 'app/views/projects/merge_requests/creations/_diffs.html.haml' - - 'app/views/projects/merge_requests/creations/_new_compare.html.haml' - - 'app/views/projects/merge_requests/creations/_new_submit.html.haml' - - 'app/views/projects/merge_requests/diffs/_different_base.html.haml' - - 'app/views/projects/merge_requests/diffs/_diffs.html.haml' - - 'app/views/projects/merge_requests/diffs/_version_controls.html.haml' - - 'app/views/projects/merge_requests/invalid.html.haml' - - 'app/views/projects/merge_requests/widget/open/_error.html.haml' - - 'app/views/projects/mirrors/_regenerate_public_ssh_key_confirm_modal.html.haml' - - 'app/views/projects/mirrors/_ssh_host_keys.html.haml' - - 'app/views/projects/no_repo.html.haml' - - 'app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml' - - 'app/views/projects/pipelines/_info.html.haml' - - 'app/views/projects/protected_branches/shared/_dropdown.html.haml' - - 'app/views/projects/protected_branches/shared/_index.html.haml' - - 'app/views/projects/protected_branches/shared/_matching_branch.html.haml' - - 'app/views/projects/protected_branches/shared/_protected_branch.html.haml' - - 'app/views/projects/protected_branches/show.html.haml' - - 'app/views/projects/protected_tags/shared/_create_protected_tag.html.haml' - - 'app/views/projects/protected_tags/shared/_dropdown.html.haml' - - 'app/views/projects/protected_tags/shared/_index.html.haml' - - 'app/views/projects/protected_tags/shared/_matching_tag.html.haml' - - 'app/views/projects/protected_tags/shared/_protected_tag.html.haml' - - 'app/views/projects/protected_tags/shared/_tags_list.html.haml' - - 'app/views/projects/protected_tags/show.html.haml' - - 'app/views/projects/registry/repositories/_tag.html.haml' - - 'app/views/projects/repositories/_feed.html.haml' - - 'app/views/projects/runners/_shared_runners.html.haml' - - 'app/views/projects/runners/edit.html.haml' - - 'app/views/projects/services/_form.html.haml' - - 'app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml' - - 'app/views/projects/services/mattermost_slash_commands/_help.html.haml' - - 'app/views/projects/services/prometheus/_metrics.html.haml' - - 'app/views/projects/services/slack_slash_commands/_help.html.haml' - - 'app/views/projects/settings/ci_cd/_badge.html.haml' - - 'app/views/projects/settings/ci_cd/_form.html.haml' - - 'app/views/projects/stage/_stage.html.haml' - - 'app/views/projects/tags/index.html.haml' - - 'app/views/projects/tags/new.html.haml' - - 'app/views/projects/tags/releases/edit.html.haml' - - 'app/views/projects/tree/_tree_row.html.haml' - - 'app/views/projects/tree/_truncated_notice_tree_row.html.haml' - - 'app/views/projects/triggers/_form.html.haml' - - 'app/views/projects/triggers/_index.html.haml' - - 'app/views/projects/triggers/_trigger.html.haml' - - 'app/views/projects/triggers/edit.html.haml' - - 'app/views/projects/wikis/_pages_wiki_page.html.haml' - - 'app/views/projects/wikis/edit.html.haml' - - 'app/views/projects/wikis/history.html.haml' - - 'app/views/search/results/_issue.html.haml' - - 'app/views/search/results/_note.html.haml' - - 'app/views/search/results/_snippet_blob.html.haml' - - 'app/views/search/results/_snippet_title.html.haml' - - 'app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml' - - 'app/views/shared/_commit_message_container.html.haml' - - 'app/views/shared/_confirm_fork_modal.html.haml' - - 'app/views/shared/_confirm_modal.html.haml' - - 'app/views/shared/_delete_label_modal.html.haml' - - 'app/views/shared/_group_form.html.haml' - - 'app/views/shared/_group_tips.html.haml' - - 'app/views/shared/_milestone_expired.html.haml' - - 'app/views/shared/_no_password.html.haml' - - 'app/views/shared/_no_ssh.html.haml' - - 'app/views/shared/_ping_consent.html.haml' - - 'app/views/shared/_project_limit.html.haml' - - 'app/views/shared/boards/components/_board.html.haml' - - 'app/views/shared/boards/components/_sidebar.html.haml' - - 'app/views/shared/boards/components/sidebar/_due_date.html.haml' - - 'app/views/shared/boards/components/sidebar/_labels.html.haml' - - 'app/views/shared/boards/components/sidebar/_milestone.html.haml' - - 'app/views/shared/deploy_tokens/_revoke_modal.html.haml' - - 'app/views/shared/hook_logs/_content.html.haml' - - 'app/views/shared/issuable/_assignees.html.haml' - - 'app/views/shared/issuable/_board_create_list_dropdown.html.haml' - - 'app/views/shared/issuable/_bulk_update_sidebar.html.haml' - - 'app/views/shared/issuable/_close_reopen_report_toggle.html.haml' - - 'app/views/shared/issuable/_form.html.haml' - - 'app/views/shared/issuable/_search_bar.html.haml' - - 'app/views/shared/issuable/_sidebar.html.haml' - - 'app/views/shared/issuable/form/_default_templates.html.haml' - - 'app/views/shared/issuable/form/_issue_assignee.html.haml' - - 'app/views/shared/issuable/form/_template_selector.html.haml' - - 'app/views/shared/issuable/form/_title.html.haml' - - 'app/views/shared/labels/_form.html.haml' - - 'app/views/shared/members/_member.html.haml' - - 'app/views/shared/milestones/_form_dates.html.haml' - - 'app/views/shared/milestones/_issuable.html.haml' - - 'app/views/shared/milestones/_milestone.html.haml' - - 'app/views/shared/milestones/_sidebar.html.haml' - - 'app/views/shared/milestones/_top.html.haml' - - 'app/views/shared/notes/_hints.html.haml' - - 'app/views/shared/notes/_note.html.haml' - - 'app/views/shared/notifications/_button.html.haml' - - 'app/views/shared/notifications/_custom_notifications.html.haml' - - 'app/views/shared/notifications/_new_button.html.haml' - - 'app/views/shared/runners/_runner_description.html.haml' - - 'app/views/shared/runners/show.html.haml' - - 'app/views/shared/snippets/_header.html.haml' - - 'app/views/shared/snippets/_snippet.html.haml' - - 'app/views/shared/web_hooks/_form.html.haml' - - 'app/views/shared/web_hooks/_hook.html.haml' - - 'app/views/u2f/_authenticate.html.haml' - - 'app/views/u2f/_register.html.haml' - - 'app/views/users/_deletion_guidance.html.haml' - - 'ee/app/views/admin/_namespace_plan_info.html.haml' - - 'ee/app/views/admin/application_settings/_templates.html.haml' - - 'ee/app/views/admin/audit_logs/index.html.haml' - - 'ee/app/views/admin/emails/show.html.haml' - - 'ee/app/views/admin/geo/nodes/edit.html.haml' - - 'ee/app/views/admin/geo/nodes/new.html.haml' - - 'ee/app/views/admin/geo/projects/_registry_failed.html.haml' - - 'ee/app/views/admin/geo/projects/_registry_never.html.haml' - - 'ee/app/views/admin/licenses/_upload_trial_license.html.haml' - - 'ee/app/views/admin/licenses/new.html.haml' - - 'ee/app/views/admin/licenses/show.html.haml' - - 'ee/app/views/admin/monitoring/ee/_nav.html.haml' - - 'ee/app/views/admin/projects/_shared_runner_status.html.haml' - - 'ee/app/views/admin/users/_auditor_access_level_radio.html.haml' - - 'ee/app/views/admin/users/_auditor_user_badge.html.haml' - - 'ee/app/views/admin/users/_limits.html.haml' - - 'ee/app/views/admin/users/_user_detail_note.html.haml' - - 'ee/app/views/dashboard/projects/_blank_state_ee_trial.html.haml' - - 'ee/app/views/errors/kerberos_denied.html.haml' - - 'ee/app/views/groups/ee/_settings_nav.html.haml' - - 'ee/app/views/groups/epics/_epic.html.haml' - - 'ee/app/views/groups/group_members/_ldap_sync.html.haml' - - 'ee/app/views/groups/group_members/_sync_button.html.haml' - - 'ee/app/views/groups/hooks/edit.html.haml' - - 'ee/app/views/groups/ldap_group_links/index.html.haml' - - 'ee/app/views/jira_connect/subscriptions/index.html.haml' - - 'ee/app/views/layouts/jira_connect.html.haml' - - 'ee/app/views/layouts/nav/ee/admin/_new_monitoring_sidebar.html.haml' - - 'ee/app/views/layouts/service_desk.html.haml' - - 'ee/app/views/ldap_group_links/_form.html.haml' - - 'ee/app/views/ldap_group_links/_ldap_group_link.html.haml' - - 'ee/app/views/ldap_group_links/_ldap_group_links.html.haml' - - 'ee/app/views/ldap_group_links/_ldap_group_links_show.html.haml' - - 'ee/app/views/ldap_group_links/_ldap_group_links_synchronizations.html.haml' - - 'ee/app/views/namespaces/_shared_runner_status.html.haml' - - 'ee/app/views/namespaces/_shared_runners_minutes_setting.html.haml' - - 'ee/app/views/namespaces/pipelines_quota/_extra_shared_runners_minutes_quota.html.haml' - - 'ee/app/views/namespaces/pipelines_quota/_list.haml' - - 'ee/app/views/notify/approved_merge_request_email.html.haml' - - 'ee/app/views/notify/epic_status_changed_email.html.haml' - - 'ee/app/views/notify/issues_csv_email.html.haml' - - 'ee/app/views/notify/new_review_email.html.haml' - - 'ee/app/views/notify/send_admin_notification.html.haml' - - 'ee/app/views/notify/send_unsubscribed_notification.html.haml' - - 'ee/app/views/notify/unapproved_merge_request_email.html.haml' - - 'ee/app/views/oauth/geo_auth/error.html.haml' - - 'ee/app/views/profiles/pipeline_quota/index.haml' - - 'ee/app/views/projects/blob/_owners.html.haml' - - 'ee/app/views/projects/commits/_mirror_status.html.haml' - - 'ee/app/views/projects/issues/_issue_weight.html.haml' - - 'ee/app/views/projects/issues/export_csv/_modal.html.haml' - - 'ee/app/views/projects/jobs/_shared_runner_limit_warning.html.haml' - - 'ee/app/views/projects/merge_requests/_approvals_count.html.haml' - - 'ee/app/views/projects/merge_requests/widget/open/_geo.html.haml' - - 'ee/app/views/projects/mirrors/_mirrored_repositories_count.html.haml' - - 'ee/app/views/projects/protected_branches/_update_protected_branch.html.haml' - - 'ee/app/views/projects/protected_branches/ee/_create_protected_branch.html.haml' - - 'ee/app/views/projects/protected_branches/ee/_dropdown.html.haml' - - 'ee/app/views/projects/protected_tags/_protected_tag_extra_create_access_levels.haml' - - 'ee/app/views/projects/protected_tags/ee/_create_protected_tag.html.haml' - - 'ee/app/views/projects/push_rules/_index.html.haml' - - 'ee/app/views/projects/services/gitlab_slack_application/_help.html.haml' - - 'ee/app/views/projects/services/gitlab_slack_application/_slack_integration_form.html.haml' - - 'ee/app/views/projects/settings/slacks/edit.html.haml' - - 'ee/app/views/shared/_additional_email_text.html.haml' - - 'ee/app/views/shared/_mirror_update_button.html.haml' - - 'ee/app/views/shared/boards/components/_list_weight.html.haml' - - 'ee/app/views/shared/epic/_search_bar.html.haml' - - 'ee/app/views/shared/issuable/_approvals.html.haml' - - 'ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml' - - 'ee/app/views/shared/issuable/_filter_weight.html.haml' - - 'ee/app/views/shared/members/ee/_ldap_tag.html.haml' - - 'ee/app/views/shared/members/ee/_override_member_buttons.html.haml' - - 'ee/app/views/shared/members/ee/_sso_badge.html.haml' - - 'ee/app/views/shared/milestones/_burndown.html.haml' - - 'ee/app/views/shared/milestones/_weight.html.haml' - - 'ee/app/views/shared/promotions/_promote_burndown_charts.html.haml' - - 'ee/app/views/shared/promotions/_promote_csv_export.html.haml' - - 'ee/app/views/shared/promotions/_promote_issue_weights.html.haml' - - 'ee/app/views/shared/promotions/_promote_repository_features.html.haml' - - 'ee/app/views/shared/promotions/_promote_servicedesk.html.haml' - - 'ee/app/views/shared/push_rules/_form.html.haml' - - 'ee/app/views/unsubscribes/show.html.haml' + - "app/views/admin/abuse_reports/_abuse_report.html.haml" + - "app/views/admin/abuse_reports/index.html.haml" + - "app/views/admin/appearances/_form.html.haml" + - "app/views/admin/application_settings/_abuse.html.haml" + - "app/views/admin/application_settings/_diff_limits.html.haml" + - "app/views/admin/application_settings/_gitaly.html.haml" + - "app/views/admin/application_settings/_ip_limits.html.haml" + - "app/views/admin/application_settings/_performance.html.haml" + - "app/views/admin/application_settings/_plantuml.html.haml" + - "app/views/admin/application_settings/_prometheus.html.haml" + - "app/views/admin/application_settings/_realtime.html.haml" + - "app/views/admin/application_settings/_repository_check.html.haml" + - "app/views/admin/application_settings/_signin.html.haml" + - "app/views/admin/application_settings/_signup.html.haml" + - "app/views/admin/application_settings/_spam.html.haml" + - "app/views/admin/application_settings/_terminal.html.haml" + - "app/views/admin/application_settings/_usage.html.haml" + - "app/views/admin/application_settings/_visibility_and_access.html.haml" + - "app/views/admin/applications/_delete_form.html.haml" + - "app/views/admin/applications/_form.html.haml" + - "app/views/admin/applications/edit.html.haml" + - "app/views/admin/applications/index.html.haml" + - "app/views/admin/applications/new.html.haml" + - "app/views/admin/applications/show.html.haml" + - "app/views/admin/background_jobs/show.html.haml" + - "app/views/admin/broadcast_messages/index.html.haml" + - "app/views/admin/dashboard/index.html.haml" + - "app/views/admin/deploy_keys/new.html.haml" + - "app/views/admin/health_check/show.html.haml" + - "app/views/admin/hook_logs/_index.html.haml" + - "app/views/admin/hook_logs/show.html.haml" + - "app/views/admin/hooks/_form.html.haml" + - "app/views/admin/hooks/edit.html.haml" + - "app/views/admin/logs/show.html.haml" + - "app/views/admin/projects/_projects.html.haml" + - "app/views/admin/projects/show.html.haml" + - "app/views/admin/requests_profiles/index.html.haml" + - "app/views/admin/runners/_runner.html.haml" + - "app/views/admin/runners/index.html.haml" + - "app/views/admin/runners/show.html.haml" + - "app/views/admin/services/_form.html.haml" + - "app/views/admin/services/index.html.haml" + - "app/views/admin/spam_logs/_spam_log.html.haml" + - "app/views/admin/spam_logs/index.html.haml" + - "app/views/admin/system_info/show.html.haml" + - "app/views/admin/users/_access_levels.html.haml" + - "app/views/admin/users/_form.html.haml" + - "app/views/admin/users/_head.html.haml" + - "app/views/admin/users/_profile.html.haml" + - "app/views/admin/users/_projects.html.haml" + - "app/views/admin/users/new.html.haml" + - "app/views/admin/users/projects.html.haml" + - "app/views/admin/users/show.html.haml" + - "app/views/clusters/clusters/_cluster.html.haml" + - "app/views/clusters/clusters/new.html.haml" + - "app/views/dashboard/milestones/index.html.haml" + - "app/views/dashboard/projects/_blank_state_admin_welcome.html.haml" + - "app/views/dashboard/projects/_blank_state_welcome.html.haml" + - "app/views/dashboard/todos/_todo.html.haml" + - "app/views/dashboard/todos/index.html.haml" + - "app/views/devise/confirmations/almost_there.haml" + - "app/views/devise/mailer/_confirmation_instructions_account.html.haml" + - "app/views/devise/mailer/_confirmation_instructions_secondary.html.haml" + - "app/views/devise/mailer/email_changed.html.haml" + - "app/views/devise/mailer/password_change.html.haml" + - "app/views/devise/mailer/reset_password_instructions.html.haml" + - "app/views/devise/mailer/unlock_instructions.html.haml" + - "app/views/devise/passwords/edit.html.haml" + - "app/views/devise/sessions/_new_base.html.haml" + - "app/views/devise/sessions/_new_crowd.html.haml" + - "app/views/devise/sessions/_new_ldap.html.haml" + - "app/views/devise/sessions/new.html.haml" + - "app/views/devise/sessions/two_factor.html.haml" + - "app/views/devise/shared/_omniauth_box.html.haml" + - "app/views/devise/shared/_sign_in_link.html.haml" + - "app/views/devise/shared/_tabs_normal.html.haml" + - "app/views/discussions/_discussion.html.haml" + - "app/views/discussions/_headline.html.haml" + - "app/views/discussions/_notes.html.haml" + - "app/views/doorkeeper/applications/_delete_form.html.haml" + - "app/views/doorkeeper/authorized_applications/_delete_form.html.haml" + - "app/views/errors/encoding.html.haml" + - "app/views/errors/git_not_found.html.haml" + - "app/views/errors/omniauth_error.html.haml" + - "app/views/errors/precondition_failed.html.haml" + - "app/views/events/_event_push.atom.haml" + - "app/views/events/event/_push.html.haml" + - "app/views/groups/_create_chat_team.html.haml" + - "app/views/groups/_group_admin_settings.html.haml" + - "app/views/groups/labels/edit.html.haml" + - "app/views/groups/labels/new.html.haml" + - "app/views/groups/milestones/edit.html.haml" + - "app/views/groups/milestones/index.html.haml" + - "app/views/groups/milestones/new.html.haml" + - "app/views/groups/projects.html.haml" + - "app/views/groups/runners/edit.html.haml" + - "app/views/groups/settings/_advanced.html.haml" + - "app/views/groups/settings/_lfs.html.haml" + - "app/views/help/_shortcuts.html.haml" + - "app/views/help/index.html.haml" + - "app/views/help/instance_configuration.html.haml" + - "app/views/help/instance_configuration/_gitlab_ci.html.haml" + - "app/views/help/instance_configuration/_gitlab_pages.html.haml" + - "app/views/help/ui.html.haml" + - "app/views/import/bitbucket/status.html.haml" + - "app/views/import/bitbucket_server/status.html.haml" + - "app/views/invites/show.html.haml" + - "app/views/layouts/_mailer.html.haml" + - "app/views/layouts/header/_default.html.haml" + - "app/views/layouts/header/_new_dropdown.haml" + - "app/views/layouts/notify.html.haml" + - "app/views/notify/_failed_builds.html.haml" + - "app/views/notify/_reassigned_issuable_email.html.haml" + - "app/views/notify/_removal_notification.html.haml" + - "app/views/notify/_successful_pipeline.html.haml" + - "app/views/notify/autodevops_disabled_email.html.haml" + - "app/views/notify/changed_milestone_email.html.haml" + - "app/views/notify/import_issues_csv_email.html.haml" + - "app/views/notify/issue_moved_email.html.haml" + - "app/views/notify/member_access_denied_email.html.haml" + - "app/views/notify/member_invite_accepted_email.html.haml" + - "app/views/notify/member_invited_email.html.haml" + - "app/views/notify/new_gpg_key_email.html.haml" + - "app/views/notify/new_mention_in_issue_email.html.haml" + - "app/views/notify/new_ssh_key_email.html.haml" + - "app/views/notify/new_user_email.html.haml" + - "app/views/notify/pages_domain_disabled_email.html.haml" + - "app/views/notify/pages_domain_enabled_email.html.haml" + - "app/views/notify/pages_domain_verification_failed_email.html.haml" + - "app/views/notify/pages_domain_verification_succeeded_email.html.haml" + - "app/views/notify/pipeline_failed_email.html.haml" + - "app/views/notify/project_was_exported_email.html.haml" + - "app/views/notify/project_was_moved_email.html.haml" + - "app/views/notify/project_was_not_exported_email.html.haml" + - "app/views/notify/push_to_merge_request_email.html.haml" + - "app/views/notify/remote_mirror_update_failed_email.html.haml" + - "app/views/notify/removed_milestone_issue_email.html.haml" + - "app/views/notify/removed_milestone_merge_request_email.html.haml" + - "app/views/notify/repository_push_email.html.haml" + - "app/views/profiles/chat_names/_chat_name.html.haml" + - "app/views/profiles/chat_names/index.html.haml" + - "app/views/profiles/chat_names/new.html.haml" + - "app/views/projects/_bitbucket_import_modal.html.haml" + - "app/views/projects/_customize_workflow.html.haml" + - "app/views/projects/_deletion_failed.html.haml" + - "app/views/projects/_fork_suggestion.html.haml" + - "app/views/projects/_gitlab_import_modal.html.haml" + - "app/views/projects/_home_panel.html.haml" + - "app/views/projects/_import_project_pane.html.haml" + - "app/views/projects/_issuable_by_email.html.haml" + - "app/views/projects/_md_preview.html.haml" + - "app/views/projects/_readme.html.haml" + - "app/views/projects/artifacts/_artifact.html.haml" + - "app/views/projects/artifacts/_tree_file.html.haml" + - "app/views/projects/artifacts/browse.html.haml" + - "app/views/projects/blame/_age_map_legend.html.haml" + - "app/views/projects/blame/show.html.haml" + - "app/views/projects/blob/_editor.html.haml" + - "app/views/projects/blob/_header_content.html.haml" + - "app/views/projects/blob/_remove.html.haml" + - "app/views/projects/blob/_render_error.html.haml" + - "app/views/projects/blob/edit.html.haml" + - "app/views/projects/blob/new.html.haml" + - "app/views/projects/blob/preview.html.haml" + - "app/views/projects/blob/viewers/_empty.html.haml" + - "app/views/projects/blob/viewers/_stl.html.haml" + - "app/views/projects/branches/_branch.html.haml" + - "app/views/projects/branches/_delete_protected_modal.html.haml" + - "app/views/projects/branches/new.html.haml" + - "app/views/projects/ci/builds/_build.html.haml" + - "app/views/projects/ci/lints/_create.html.haml" + - "app/views/projects/compare/_form.html.haml" + - "app/views/projects/compare/index.html.haml" + - "app/views/projects/cycle_analytics/_empty_stage.html.haml" + - "app/views/projects/cycle_analytics/_no_access.html.haml" + - "app/views/projects/cycle_analytics/_overview.html.haml" + - "app/views/projects/cycle_analytics/show.html.haml" + - "app/views/projects/deploy_keys/_form.html.haml" + - "app/views/projects/deploy_keys/_index.html.haml" + - "app/views/projects/deploy_keys/edit.html.haml" + - "app/views/projects/deployments/_deployment.html.haml" + - "app/views/projects/diffs/_file_header.html.haml" + - "app/views/projects/diffs/_replaced_image_diff.html.haml" + - "app/views/projects/diffs/_stats.html.haml" + - "app/views/projects/empty.html.haml" + - "app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml" + - "app/views/projects/hook_logs/_index.html.haml" + - "app/views/projects/hook_logs/show.html.haml" + - "app/views/projects/hooks/edit.html.haml" + - "app/views/projects/imports/new.html.haml" + - "app/views/projects/imports/show.html.haml" + - "app/views/projects/issues/_new_branch.html.haml" + - "app/views/projects/issues/import_csv/_modal.html.haml" + - "app/views/projects/issues/show.html.haml" + - "app/views/projects/jobs/_header.html.haml" + - "app/views/projects/jobs/_table.html.haml" + - "app/views/projects/jobs/index.html.haml" + - "app/views/projects/labels/edit.html.haml" + - "app/views/projects/labels/new.html.haml" + - "app/views/projects/mattermosts/_no_teams.html.haml" + - "app/views/projects/mattermosts/_team_selection.html.haml" + - "app/views/projects/mattermosts/new.html.haml" + - "app/views/projects/merge_requests/_commits.html.haml" + - "app/views/projects/merge_requests/_discussion.html.haml" + - "app/views/projects/merge_requests/_how_to_merge.html.haml" + - "app/views/projects/merge_requests/_mr_title.html.haml" + - "app/views/projects/merge_requests/conflicts/_commit_stats.html.haml" + - "app/views/projects/merge_requests/conflicts/_file_actions.html.haml" + - "app/views/projects/merge_requests/conflicts/_submit_form.html.haml" + - "app/views/projects/merge_requests/conflicts/components/_diff_file_editor.html.haml" + - "app/views/projects/merge_requests/conflicts/components/_inline_conflict_lines.html.haml" + - "app/views/projects/merge_requests/conflicts/show.html.haml" + - "app/views/projects/merge_requests/creations/_diffs.html.haml" + - "app/views/projects/merge_requests/creations/_new_compare.html.haml" + - "app/views/projects/merge_requests/creations/_new_submit.html.haml" + - "app/views/projects/merge_requests/diffs/_different_base.html.haml" + - "app/views/projects/merge_requests/diffs/_diffs.html.haml" + - "app/views/projects/merge_requests/diffs/_version_controls.html.haml" + - "app/views/projects/merge_requests/invalid.html.haml" + - "app/views/projects/merge_requests/widget/open/_error.html.haml" + - "app/views/projects/mirrors/_regenerate_public_ssh_key_confirm_modal.html.haml" + - "app/views/projects/mirrors/_ssh_host_keys.html.haml" + - "app/views/projects/no_repo.html.haml" + - "app/views/projects/pipeline_schedules/_pipeline_schedule.html.haml" + - "app/views/projects/pipelines/_info.html.haml" + - "app/views/projects/protected_branches/shared/_dropdown.html.haml" + - "app/views/projects/protected_branches/shared/_index.html.haml" + - "app/views/projects/protected_branches/shared/_matching_branch.html.haml" + - "app/views/projects/protected_branches/shared/_protected_branch.html.haml" + - "app/views/projects/protected_branches/show.html.haml" + - "app/views/projects/protected_tags/shared/_create_protected_tag.html.haml" + - "app/views/projects/protected_tags/shared/_dropdown.html.haml" + - "app/views/projects/protected_tags/shared/_index.html.haml" + - "app/views/projects/protected_tags/shared/_matching_tag.html.haml" + - "app/views/projects/protected_tags/shared/_protected_tag.html.haml" + - "app/views/projects/protected_tags/shared/_tags_list.html.haml" + - "app/views/projects/protected_tags/show.html.haml" + - "app/views/projects/registry/repositories/_tag.html.haml" + - "app/views/projects/repositories/_feed.html.haml" + - "app/views/projects/runners/_shared_runners.html.haml" + - "app/views/projects/runners/edit.html.haml" + - "app/views/projects/services/mattermost_slash_commands/_detailed_help.html.haml" + - "app/views/projects/services/mattermost_slash_commands/_help.html.haml" + - "app/views/projects/services/prometheus/_metrics.html.haml" + - "app/views/projects/services/slack_slash_commands/_help.html.haml" + - "app/views/projects/settings/ci_cd/_badge.html.haml" + - "app/views/projects/settings/ci_cd/_form.html.haml" + - "app/views/projects/tags/index.html.haml" + - "app/views/projects/tags/releases/edit.html.haml" + - "app/views/projects/tree/_tree_row.html.haml" + - "app/views/projects/tree/_truncated_notice_tree_row.html.haml" + - "app/views/projects/triggers/_form.html.haml" + - "app/views/projects/triggers/_index.html.haml" + - "app/views/projects/triggers/_trigger.html.haml" + - "app/views/projects/triggers/edit.html.haml" + - "app/views/projects/wikis/_pages_wiki_page.html.haml" + - "app/views/search/results/_issue.html.haml" + - "app/views/search/results/_note.html.haml" + - "app/views/search/results/_snippet_blob.html.haml" + - "app/views/search/results/_snippet_title.html.haml" + - "app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml" + - "app/views/shared/_commit_message_container.html.haml" + - "app/views/shared/_delete_label_modal.html.haml" + - "app/views/shared/_group_form.html.haml" + - "app/views/shared/_group_tips.html.haml" + - "app/views/shared/_milestone_expired.html.haml" + - "app/views/shared/_no_password.html.haml" + - "app/views/shared/_ping_consent.html.haml" + - "app/views/shared/_project_limit.html.haml" + - "app/views/shared/boards/components/_board.html.haml" + - "app/views/shared/boards/components/_sidebar.html.haml" + - "app/views/shared/boards/components/sidebar/_due_date.html.haml" + - "app/views/shared/boards/components/sidebar/_labels.html.haml" + - "app/views/shared/boards/components/sidebar/_milestone.html.haml" + - "app/views/shared/hook_logs/_content.html.haml" + - "app/views/shared/issuable/_assignees.html.haml" + - "app/views/shared/issuable/_board_create_list_dropdown.html.haml" + - "app/views/shared/issuable/_close_reopen_report_toggle.html.haml" + - "app/views/shared/issuable/_form.html.haml" + - "app/views/shared/issuable/_search_bar.html.haml" + - "app/views/shared/issuable/_sidebar.html.haml" + - "app/views/shared/issuable/form/_default_templates.html.haml" + - "app/views/shared/issuable/form/_issue_assignee.html.haml" + - "app/views/shared/issuable/form/_template_selector.html.haml" + - "app/views/shared/issuable/form/_title.html.haml" + - "app/views/shared/labels/_form.html.haml" + - "app/views/shared/members/_member.html.haml" + - "app/views/shared/milestones/_form_dates.html.haml" + - "app/views/shared/milestones/_issuable.html.haml" + - "app/views/shared/milestones/_milestone.html.haml" + - "app/views/shared/milestones/_sidebar.html.haml" + - "app/views/shared/milestones/_top.html.haml" + - "app/views/shared/notes/_hints.html.haml" + - "app/views/shared/notifications/_button.html.haml" + - "app/views/shared/notifications/_new_button.html.haml" + - "app/views/shared/runners/_runner_description.html.haml" + - "app/views/shared/runners/show.html.haml" + - "app/views/shared/snippets/_header.html.haml" + - "app/views/shared/snippets/_snippet.html.haml" + - "app/views/shared/web_hooks/_form.html.haml" + - "app/views/shared/web_hooks/_hook.html.haml" + - "app/views/u2f/_authenticate.html.haml" + - "app/views/u2f/_register.html.haml" + - "app/views/users/_deletion_guidance.html.haml" + - "ee/app/views/admin/_namespace_plan_info.html.haml" + - "ee/app/views/admin/application_settings/_templates.html.haml" + - "ee/app/views/admin/audit_logs/index.html.haml" + - "ee/app/views/admin/emails/show.html.haml" + - "ee/app/views/admin/geo/projects/_registry_failed.html.haml" + - "ee/app/views/admin/geo/projects/_registry_never.html.haml" + - "ee/app/views/admin/licenses/_upload_trial_license.html.haml" + - "ee/app/views/admin/licenses/new.html.haml" + - "ee/app/views/admin/licenses/show.html.haml" + - "ee/app/views/admin/monitoring/ee/_nav.html.haml" + - "ee/app/views/admin/projects/_shared_runner_status.html.haml" + - "ee/app/views/admin/users/_auditor_access_level_radio.html.haml" + - "ee/app/views/admin/users/_auditor_user_badge.html.haml" + - "ee/app/views/admin/users/_limits.html.haml" + - "ee/app/views/admin/users/_user_detail_note.html.haml" + - "ee/app/views/dashboard/projects/_blank_state_ee_trial.html.haml" + - "ee/app/views/errors/kerberos_denied.html.haml" + - "ee/app/views/groups/ee/_settings_nav.html.haml" + - "ee/app/views/groups/group_members/_ldap_sync.html.haml" + - "ee/app/views/groups/group_members/_sync_button.html.haml" + - "ee/app/views/groups/hooks/edit.html.haml" + - "ee/app/views/groups/ldap_group_links/index.html.haml" + - "ee/app/views/jira_connect/subscriptions/index.html.haml" + - "ee/app/views/layouts/jira_connect.html.haml" + - "ee/app/views/layouts/nav/ee/admin/_new_monitoring_sidebar.html.haml" + - "ee/app/views/layouts/service_desk.html.haml" + - "ee/app/views/ldap_group_links/_form.html.haml" + - "ee/app/views/ldap_group_links/_ldap_group_link.html.haml" + - "ee/app/views/ldap_group_links/_ldap_group_links.html.haml" + - "ee/app/views/ldap_group_links/_ldap_group_links_show.html.haml" + - "ee/app/views/ldap_group_links/_ldap_group_links_synchronizations.html.haml" + - "ee/app/views/namespaces/_shared_runner_status.html.haml" + - "ee/app/views/namespaces/_shared_runners_minutes_setting.html.haml" + - "ee/app/views/namespaces/pipelines_quota/_extra_shared_runners_minutes_quota.html.haml" + - "ee/app/views/namespaces/pipelines_quota/_list.haml" + - "ee/app/views/notify/approved_merge_request_email.html.haml" + - "ee/app/views/notify/epic_status_changed_email.html.haml" + - "ee/app/views/notify/new_review_email.html.haml" + - "ee/app/views/notify/send_admin_notification.html.haml" + - "ee/app/views/notify/send_unsubscribed_notification.html.haml" + - "ee/app/views/notify/unapproved_merge_request_email.html.haml" + - "ee/app/views/oauth/geo_auth/error.html.haml" + - "ee/app/views/projects/commits/_mirror_status.html.haml" + - "ee/app/views/projects/jobs/_shared_runner_limit_warning.html.haml" + - "ee/app/views/projects/merge_requests/_approvals_count.html.haml" + - "ee/app/views/projects/merge_requests/widget/open/_geo.html.haml" + - "ee/app/views/projects/mirrors/_mirrored_repositories_count.html.haml" + - "ee/app/views/projects/protected_branches/_update_protected_branch.html.haml" + - "ee/app/views/projects/protected_branches/ee/_create_protected_branch.html.haml" + - "ee/app/views/projects/protected_branches/ee/_dropdown.html.haml" + - "ee/app/views/projects/protected_tags/_protected_tag_extra_create_access_levels.haml" + - "ee/app/views/projects/protected_tags/ee/_create_protected_tag.html.haml" + - "ee/app/views/projects/push_rules/_index.html.haml" + - "ee/app/views/projects/services/gitlab_slack_application/_help.html.haml" + - "ee/app/views/projects/services/gitlab_slack_application/_slack_integration_form.html.haml" + - "ee/app/views/projects/settings/slacks/edit.html.haml" + - "ee/app/views/shared/_mirror_update_button.html.haml" + - "ee/app/views/shared/boards/components/_list_weight.html.haml" + - "ee/app/views/shared/epic/_search_bar.html.haml" + - "ee/app/views/shared/issuable/_approvals.html.haml" + - "ee/app/views/shared/issuable/_board_create_list_dropdown.html.haml" + - "ee/app/views/shared/issuable/_filter_weight.html.haml" + - "ee/app/views/shared/members/ee/_ldap_tag.html.haml" + - "ee/app/views/shared/members/ee/_override_member_buttons.html.haml" + - "ee/app/views/shared/members/ee/_sso_badge.html.haml" + - "ee/app/views/shared/milestones/_burndown.html.haml" + - "ee/app/views/shared/milestones/_weight.html.haml" + - "ee/app/views/shared/promotions/_promote_issue_weights.html.haml" + - "ee/app/views/shared/promotions/_promote_repository_features.html.haml" + - "ee/app/views/shared/promotions/_promote_servicedesk.html.haml" + - "ee/app/views/shared/push_rules/_form.html.haml" + - "ee/app/views/unsubscribes/show.html.haml" diff --git a/.markdownlint.json b/.markdownlint.json index ce319756c5..88e3d5f775 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -45,6 +45,8 @@ "DevOps", "Elasticsearch", "Facebook", + "GDK", + "Geo", "Git LFS", "git-annex", "Git", @@ -59,9 +61,11 @@ "GitLab Shell", "GitLab Workhorse", "GitLab", + "Gitleaks", "Gmail", "Google", "Grafana", + "Gzip", "Helm", "HipChat", "Ingress", @@ -99,6 +103,7 @@ "PostgreSQL", "Prometheus", "Puma", + "puma-worker-killer", "Python", "Rake", "Redis", @@ -113,8 +118,10 @@ "Shibboleth", "Slack", "SMTP", + "SpotBugs", "SSH", "Tiller", + "TOML", "Trello", "Trello Power-Ups", "TypeScript", @@ -123,7 +130,9 @@ "Ultra Auth", "Unicorn", "unicorn-worker-killer", + "URL", "WebdriverIO", + "YAML", "YouTrack" ], "code_blocks": false diff --git a/.rubocop.yml b/.rubocop.yml index c98d027cee..3d013a650e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -28,6 +28,12 @@ AllCops: - 'file_hooks/**/*' CacheRootDirectory: tmp +Cop/AvoidKeywordArgumentsInSidekiqWorkers: + Enabled: true + Include: + - 'app/workers/**/*' + - 'ee/app/workers/**/*' + Cop/StaticTranslationDefinition: Enabled: true Exclude: @@ -200,12 +206,26 @@ Gitlab/ConstGetInheritFalse: Exclude: - 'qa/bin/*' +Gitlab/ChangeTimezone: + Enabled: true + Exclude: + - config/initializers/time_zone.rb + Gitlab/HTTParty: Enabled: true Exclude: - 'spec/**/*' - 'ee/spec/**/*' +Gitlab/Json: + Enabled: true + Exclude: + - 'db/**/*' + - 'qa/**/*' + - 'scripts/**/*' + - 'lib/rspec_flaky/**/*' + - 'lib/quality/**/*' + GitlabSecurity/PublicSend: Enabled: true Exclude: @@ -221,10 +241,8 @@ GitlabSecurity/PublicSend: Gitlab/DuplicateSpecLocation: Exclude: - - ee/spec/helpers/auth_helper_spec.rb - ee/spec/lib/gitlab/gl_repository_spec.rb - ee/spec/services/merge_requests/refresh_service_spec.rb - - ee/spec/helpers/ee/auth_helper_spec.rb - ee/spec/services/ee/merge_requests/refresh_service_spec.rb Cop/InjectEnterpriseEditionModule: @@ -325,11 +343,45 @@ RSpec/AnyInstanceOf: RSpec/ImplicitSubject: Enabled: false +# WIP See https://gitlab.com/gitlab-org/gitlab/-/issues/211580 RSpec/LeakyConstantDeclaration: Enabled: true Exclude: - - 'spec/**/*.rb' - - 'qa/spec/**/*.rb' + - 'spec/db/schema_spec.rb' + - 'spec/lib/feature_spec.rb' + - 'spec/lib/gitlab/ci/build/credentials/factory_spec.rb' + - 'spec/lib/gitlab/ci/config/entry/retry_spec.rb' + - 'spec/lib/gitlab/cluster/mixins/puma_cluster_spec.rb' + - 'spec/lib/gitlab/cluster/mixins/unicorn_http_server_spec.rb' + - 'spec/lib/gitlab/config/entry/factory_spec.rb' + - 'spec/lib/gitlab/config/entry/simplifiable_spec.rb' + - 'spec/lib/gitlab/database/migration_helpers_spec.rb' + - 'spec/lib/gitlab/database/obsolete_ignored_columns_spec.rb' + - 'spec/lib/gitlab/database/with_lock_retries_spec.rb' + - 'spec/lib/gitlab/git/diff_collection_spec.rb' + - 'spec/lib/gitlab/import_export/import_test_coverage_spec.rb' + - 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb' + - 'spec/lib/gitlab/jira_import/issues_importer_spec.rb' + - 'spec/lib/gitlab/no_cache_headers_spec.rb' + - 'spec/lib/gitlab/path_regex_spec.rb' + - 'spec/lib/gitlab/quick_actions/dsl_spec.rb' + - 'spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb' + - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb' + - 'spec/lib/marginalia_spec.rb' + - 'spec/mailers/notify_spec.rb' + - 'spec/migrations/20191125114345_add_admin_mode_protected_path_spec.rb' + - 'spec/models/concerns/batch_destroy_dependent_associations_spec.rb' + - 'spec/models/concerns/bulk_insert_safe_spec.rb' + - 'spec/models/concerns/bulk_insertable_associations_spec.rb' + - 'spec/models/concerns/triggerable_hooks_spec.rb' + - 'spec/models/repository_spec.rb' + - 'spec/requests/api/graphql/tasks/task_completion_status_spec.rb' + - 'spec/serializers/commit_entity_spec.rb' + - 'spec/services/clusters/applications/check_installation_progress_service_spec.rb' + - 'spec/services/clusters/applications/check_uninstall_progress_service_spec.rb' + - 'spec/support/shared_contexts/spam_constants.rb' + - 'spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb' + - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb' RSpec/EmptyLineAfterHook: Enabled: false @@ -387,3 +439,17 @@ Performance/ChainArrayAllocation: - 'lib/gitlab/import_export/**/*' - 'ee/lib/gitlab/import_export/**/*' - 'ee/lib/ee/gitlab/import_export/**/*' + +Rails/TimeZone: + Enabled: true + EnforcedStyle: 'flexible' + Include: + - 'app/controllers/**/*' + - 'app/services/**/*' + - 'spec/controllers/**/*' + - 'spec/services/**/*' + - 'ee/app/controllers/**/*' + - 'ee/app/services/**/*' + - 'ee/spec/controllers/**/*' + - 'ee/spec/services/**/*' + diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 66a025a8fe..bd0f9184cd 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -475,7 +475,6 @@ Style/MixinUsage: Style/MultilineIfModifier: Exclude: - 'app/helpers/snippets_helper.rb' - - 'app/models/project_wiki.rb' - 'app/services/ci/process_pipeline_service.rb' - 'lib/api/commit_statuses.rb' @@ -614,29 +613,6 @@ Style/StringLiteralsInInterpolation: Style/SymbolProc: Enabled: false -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, AllowSafeAssignment. -# SupportedStyles: require_parentheses, require_no_parentheses, require_parentheses_when_complex -Style/TernaryParentheses: - Exclude: - - 'app/finders/projects_finder.rb' - - 'app/helpers/namespaces_helper.rb' - - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb' - - 'spec/requests/api/pipeline_schedules_spec.rb' - - 'spec/support/capybara.rb' - -# Offense count: 8 -# Cop supports --auto-correct. -Style/UnneededCondition: - Exclude: - - 'app/helpers/button_helper.rb' - - 'app/helpers/environment_helper.rb' - - 'app/models/project.rb' - - 'app/services/issuable/clone/base_service.rb' - - 'lib/gitlab/email/message/repository_push.rb' - - 'spec/lib/rspec_flaky/flaky_example_spec.rb' - # Offense count: 99 # Cop supports --auto-correct. Style/UnneededInterpolation: diff --git a/CHANGELOG-EE.md b/CHANGELOG-EE.md index 76ba4b82fe..b48dce6546 100644 --- a/CHANGELOG-EE.md +++ b/CHANGELOG-EE.md @@ -1,5 +1,16 @@ Please view this file on the master branch, on stable branches it's out of date. +## 12.10.5 (2020-05-13) + +### Fixed (1 change) + +- Remove check for user being an applicable code owner. !31809 + + +## 12.10.4 (2020-05-05) + +- No changes. + ## 12.10.2 (2020-04-30) ### Security (3 changes) @@ -59,6 +70,19 @@ Please view this file on the master branch, on stable branches it's out of date. - Add health status counts to usage data. !28964 +## 12.9.6 (2020-05-05) + +- No changes. + +## 12.9.5 (2020-04-30) + +### Security (3 changes) + +- Fix rendering failure of Audit Event generated by Releases API. +- Ensure that NuGet package versions are SemVer compliant. +- Ensure that NuGet package versions are validated before updating the stored file path. + + ## 12.9.4 (2020-04-16) - No changes. @@ -231,6 +255,15 @@ Please view this file on the master branch, on stable branches it's out of date. - Allow users to be marked as service users. !202680 +## 12.8.10 (2020-04-30) + +### Security (3 changes) + +- Fix rendering failure of Audit Event generated by Releases API. +- Ensure that NuGet package versions are SemVer compliant. +- Ensure that NuGet package versions are validated before updating the stored file path. + + ## 12.8.9 (2020-04-14) ### Security (1 change) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05828ccd0d..d192f143f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,20 +2,587 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. -## 12.10.3 (2020-05-04) +## 13.0.0 (2020-05-22) -### Fixed (6 changes) +### Removed (20 changes, 5 of them are from the community) +- Remove project routes that were deprecated before 12.1. !26808 +- Drop x-y-stable version pinning for Secure templates. !29603 +- Remove logs from the admin pages. !30485 +- Remove deprecated /admin/application_settings redirect. !30532 +- Drop support for License-Management CI template. !30645 +- Remove deprecated InfluxDB. !30786 +- Remove deprecated Release Evidence endpoints. !30975 +- Remove deprecated Release Evidence endpoints documentation. !30978 +- Drop support for `license_management` artifact. !31247 +- Remove deprecated container scanning report parser. !31294 +- Remove rake task `gitlab:track_deployment`. !31404 +- Remove token attribute from Runners API. !31448 +- Remove support for Ruby format variable interpolation (`%{variable}`) in custom dashboards. !31581 +- Remove JenkinsDeprecatedService. !31607 (tnwx) +- Remove ruby_memory_bytes metric, duplicate of ruby_process_resident_memory_bytes. !31705 +- Remove project_list_show_mr_count feature flag. !31789 (Gilang Gumilar) +- Remove project_list_show_issue_count feature flag. !31793 (Gilang Gumilar) +- Remove set_user_last_activity feature flag. !31795 (Gilang Gumilar) +- Remove registrations_recaptcha feature flag. !31797 (Gilang Gumilar) +- Remove deprecated Sidekiq rake tasks. + +### Fixed (171 changes, 54 of them are from the community) + +- Allow public access to pipeline schedules. !20806 (Lee Tickett) +- Add user last_activity logging in GraphQL. !23063 +- Render TestReport parsing errors back to pipeline test summary. !24188 +- Add user popovers to system notes. !24241 +- Fix missing RSS feed events. !28054 +- Resolve Text for future Release date grammatically incorrect. !28075 +- Fix number of approvals given calculation. !28293 (Steffen Köhler) +- Always display new subgroup button when permission is granted. !28309 (Mattias Michaux) +- Correct the permission according to docs. !28657 +- Fix duplicated activity and events on deletion of tag. !28861 (Sashi Kumar) +- Fix init.d script to correctly set web server PID. !29164 +- Honor per_page in Search API. !29197 +- fix: use the source project to generate commit links for un-persisted merge requests. !29243 (Chieh-Min Wang) +- Fix display of some overflowing merge request diffs. !29267 +- Move prepend to last line in helper files. !29327 (Rajendra Kadam) +- Prevent duplicate tooltips when hovering over status emoji in comments. !29356 +- Update Elastic Stack chart to 2.0.0 to support kubernetes 1.16. !29601 +- Fix minor spacing issue at Snippet blob viewer. !29625 (Karthick Venkatesan) +- Eliminate errors in wiki controller during edit. !29645 +- Fixed copy as GFM not copying upload links. !29683 +- Bump max search depth from 2 to 4 when looking for files SAST analyzers can handle. !29732 +- Move snippet raw_url attribute to base entity. !29776 +- Return content from repo in snippet raw endpoint. !29781 +- Return file name from repo in snippet endpoints. !29785 +- Propagation of service templates also covers services with separate data tables. !29805 +- Fix bug in personal snippets when somebody is mentioned. !29835 (Sashi Kumar) +- Embed metrics charts for both /metrics and /metrics_dashboard routes. !29838 +- Fix admin mode access on GraphiQL controller. !29845 (Diego Louzán) +- Exclude html entities from haml lint. !29847 (Lee Tickett) +- Fixed JS error for anonymous views of a snippet. !29854 +- Destroy Dropzone hidden input when form is destroyed. !29882 +- Move prepend to last line in lib/gitlab files. !29938 (Rajendra) +- Match Jira keys with trailing characters. !29953 +- Fixed Cancel action on Snippet edit for existing snippets. !29993 +- Warn user before losing wiki content. !30037 +- Move prepend to last line in lib/gitlab files. !30070 (Rajendra Kadam) +- Fix an issue where the Search dropdown results would not be clickable. !30087 (mbergeron) +- Capture all errors when updating repository storage. !30119 +- Move alert management behind a feature flag. !30133 +- Fix bug when services appear active even though they are not. !30160 +- Fix moving an issue when there is a group reference. !30185 +- Move prepend to last line in lib/gitlab files. !30194 (Rajendra Kadam) +- Move prepend to last line in lib/gitlab files. !30289 (Rajendra Kadam) +- Move prepend to last line in lib/gitlab files. !30291 (Rajendra Kadam) +- Set NULL `lock_version` values to 0 for CI objects. !30305 - Fix errors creating project with active Prometheus service template. !30340 +- Add Activity icons for Wiki updated and destroyed events. !30349 +- Gracefully handle orphaned member invites. !30355 - Fix incorrect commits number in commits list. !30412 - Fix second 500 error with NULL restricted visibility levels. !30414 +- Move prepend to last line in ee/services. !30425 (Rajendra Kadam) - Add LFS badge feature flag to RefsController#logs_tree. !30442 +- Fix mirror repos docs link. !30443 +- Added right margin to Clone Snippet button. !30471 +- Fix blob link for the code search. !30473 +- Use Jira import owner as the issue author when importing issues from Jira. !30504 +- Correctly count wiki pages in sidebar. !30508 +- Stretch heatmap metrics full column size. !30524 +- Upgrade Unicorn to v5.5.1. !30541 +- Avoid copying diffs as Markdown tables. !30572 +- Fixes overlapping tooltips when clicking copy buttons. !30622 +- Fix 500 error for non-existing snippet on graphql mutations. !30632 (Sashi Kumar) +- Change validation rules for profile email addresses. !30633 +- Set timeout for Google OAuth to prevent 503 error. !30653 +- Remove extra sleep when obtaining exclusive lease. !30654 +- Fix GitLab CI/CD Scala template. !30667 +- Fix checkmark position on dropdowns. !30685 +- Remove Visibility from terraform widget. !30737 +- Use migration bot user in snippet migration. !30762 +- Fix discard button not showing for new empty files in Web IDE. !30767 - Disable schema dumping after migrations in production. !30812 +- Fix mapping group membets as Jira issues authors/assignees. !30820 +- Align styling of snippet search results. !30837 +- Move daily create users statistics cronjob to CE. !30843 +- Fixed alignment of Snippet Clone copy buttons. !30897 +- Increase constrast ratio of text in some tables. !30903 +- Ignore .gitattributes if they contain invalid byte sequences. !30922 +- Fix bug in Snippet BlobViewer GraphQL definition. !30927 +- Fix layout in issue view, on large screen some buttons were misaligned. !30947 (Michele (macno) Azzolari) +- Fix error renaming files using web IDE. !30969 +- Handle Snippet file name errors in backfill. !30981 +- Correctly track the store that external MR diffs are placed on. !31005 +- Fix duplicate index removal on ci_pipelines.project_id. !31043 +- Update recursive-open-struct to 1.1.1 to make it compatible with ruby 2.7. !31047 +- Revert CODEOWNERS validation of Web requests in diff check. !31087 +- Wrap wiki blob search result in its own object. !31155 +- Allow multiple usage of EE extension/inclusion on last lines. !31183 (Rajendra Kadam) +- Fix 500 error loading environments index. !31184 +- Fix 500 on creating an invalid domains and verification. !31190 +- Fix redirect loop on .com when 2FA is required. !31229 +- Fix regression and allow SCIM to create SAML identity. !31238 +- Fix incorrect number of errors returned when querying sentry errors. !31252 +- Fix RST rendering hanging on large files. !31287 +- Trim whitespace in directory names in the Web IDE. !31305 +- Fix 'not enough data' in Value Stream Analytics when low median values are returned. !31315 +- Add tooltip to container registry tags last update column. !31317 +- Fix Istio broken Istio metrics installation. !31382 +- Link to subgroup milestones correctly from group milestones page. !31383 +- Remove kwargs from storage move worker. !31412 +- Make edit board text sentence case. !31418 +- Katex render and vscode output improvements for markdown. !31433 (Reinhold Gschweicher ) +- Fix overwrite check in GitLab import/export. !31439 +- Fix API requests for branch names ending in .txt. !31446 (Daniel Stone) +- Avoid repository size checkings in snippet migrations for migration bot. !31473 +- Use iso 8601 timestamp format in metrics dashboard annotations graphql resource to assure multi browser compatibility. !31474 +- In WebIDE get files with relative path instead of web_url. !31478 +- Fix snippet migration when user has invalid info. !31488 +- Add elipsis to container registry tag name. !31584 +- Add instance column to services table if it's missing. !31631 +- Fix issue with broken images in Web IDE markdown. !31638 +- Fixes bug where variables were not protected by default when using the correct CI/CD admin setting. !31655 +- Decode dashboard_path when creating annotations. !31665 +- Fix "how to checkout MR" help link. !31688 +- Fixed redirection when deleting a project snippet. !31709 +- Fix templates API endpoint when project name has dots. !31758 +- Remove detection of file in Dependency Scanning template. !31819 +- Move prepend to last line in app models. !31826 (Rajendra Kadam) +- Move prepend to last line in app models 2. !31827 (Rajendra Kadam) +- Move prepend to last line in app models 3. !31829 (Rajendra Kadam) +- Move include_if_ee to last line in ee/app 1. !31832 (Rajendra Kadam) +- Restore original sort order of the metrics dashboard select list. !31859 +- Fix Snippet update error bug losing changes. !31873 +- Replace the outdated link. !31874 (Renamoo) +- Replace let! with let_it_be in user api spec. !31901 (Rajendra Kadam) +- Replace let! with let_it_be in merge request spec. !31909 (Rajendra Kadam) +- angelog Replace let! with let_it_be in pipelines spec. !31916 (Rajendra Kadam) +- Fix public metrics dashboard visibility bug. !31925 +- Add nested file detection for Dependency Scanning. !31932 +- Add class stubs and fix leaky constant cop alert. !31938 (Rajendra Kadam) +- Add class stubs and fix leaky constant alert in content whitelist spec. !31946 (Rajendra Kadam) +- Fix broken heading of Vue 3 migration guide doc. !31951 (Gilang Gumilar) +- Add class stubs and fix leaky constant alert in query recorder spec. !31954 (Rajendra Kadam) +- Fix no scroll when overflow in IDE right pane. !31961 +- Fix leaky constant cop issue in clone dashboard service spec. !31962 (Rajendra Kadam) +- Stub class constant in resolve discussion spec. !31965 (Rajendra Kadam) +- Fix leaky constant issue in upgrade progress service check. !31969 (Rajendra Kadam) +- Clear merge request error on push to source branch. !32001 +- Allow only users with `adminNote` permission to edit the design note. !32035 +- Fix leaky constant issue in retry build service check. !32038 (Rajendra Kadam) +- Fix leaky constant issue in env assignment spec. !32040 (Rajendra Kadam) +- Fix leaky constant issue in statistics api spec. !32042 (Rajendra Kadam) +- Fix leaky constant issue in merge request policy spec. !32044 (Rajendra Kadam) +- Fix leaky constant issue in tree spec. !32045 (Rajendra Kadam) +- Fix leaky constant issue in mentionable spec. !32049 (Rajendra Kadam) +- Fix leaky constant issue in json serialization spec. !32051 (Rajendra Kadam) +- Fix leaky constant issue in cluster spec. !32053 (Rajendra Kadam) +- Fix bug in Groups API when statistics are requested in an unauthenticated API call. !32057 +- Fix leaky constant issue in nulls pt2 spec. !32058 (Rajendra Kadam) +- Fix leaky constant issue in application settings encrypt spec. !32066 (Rajendra Kadam) +- Fix leaky constant issue in system check spec. !32080 (Rajendra Kadam) +- Fix leaky constant issue in simple executor spec. !32082 (Rajendra Kadam) +- Fix leaky constant issue in jwt spec. !32093 (Rajendra Kadam) +- Update android template. !32096 +- Fix leaky constant issue in factory spec. !32099 (Rajendra Kadam) +- Fix leaky constant issue in sidekiq middleware spec. !32101 (Rajendra Kadam) +- Fix leaky constant issue connection, master check and attr config spec. !32144 (Rajendra Kadam) +- Fix updating of Markdown fields when Markdown cache version is incremented. !32219 +- Fix incorrect regex used in FileUploader#extract_dynamic_path. !32271 +- Improve responses in the snippet create/update API endpoints. !32282 +- Send Devise emails triggered from the 'Email' model asynchronously. !32286 +- Re-enable negative filters for Boards. !32348 +- Fix missing space character in alert header. !32395 +- Fix display of embedded snippets. !32411 (Jan Beckmann) +- Fixed redirection to project snippets. !32530 +- Rake task gitlab:cleanup:orphan_lfs_files should clear the cached value or repository size. !32541 +- Fixed enabled merge button incorrectly showing to users who can't merge. +- Fixed misaligned avatar in commit discussion form. +- Fixed cancel reply button not alerting the user. +- Fixes commit message emojis not rendering in Vue file list. +- Fix logging of username in /jwt/auth. - Fixes branch name not getting escaped correctly on frontend. -### Changed (1 change) +### Deprecated (2 changes) +- Deprecate /plugins directory. !29678 +- Implement external database checker in dashboard controller. !30389 + +### Changed (121 changes, 42 of them are from the community) + +- Support limits for offset based pagination. !28460 +- Redirect issues routes under /-/ scope. !28655 +- Add Fluentd into cluster apps page. !28847 +- Disallow developers to delete builds of protected branches. !28881 (Alexander Kutelev) +- Store status of repository storage moves. !29095 +- Update the example regex in the image expiration policy UI. !29348 +- Add WAF and Cilium Log column for Fluentd table. !29457 +- Update Fluentd model to support multiple logs. !29458 +- Add Cilium to Fluentd UI controls on the Cluster Application page. !29511 +- Use alerts instead of toasts in Image Repository details. !29685 +- Avoid commit when snippet file_name and content are not present. !29761 +- Recreate foreign key in project settings to use nullify instead of cascade. !29767 +- Surface alerts add sidebar link. !29775 +- Make setting alerts on the monitoring dashboard available to GitLab Core users. !29789 +- Keep latest artifact for each ref. !29802 +- Change placeholder in search input for Analytics features. !29858 (Gilang Gumilar) +- Test Jira connection before running import. !29926 +- Remove snippet file_name from snippet lists. !29937 +- Add new keep regex to expiration policy settings ui. !29940 +- Alert management can user enable. !30024 +- Expose the updated_at attribute in the todos API. !30035 +- Update GitLab-managed helm from 2.16.3 to 2.16.6, improving the reliability of GitLab's Kubernetes integration. !30067 +- Show correct label and count on Jira import form. !30072 +- Copy pipelines routing under - scope. !30159 +- Return validation errors for invalid pod name or container name when viewing pod logs. !30165 (Sashi Kumar) +- Move global autocomplete routes to /-/ scope. !30173 +- Update the cancel comment note text to a less ambiguous statement. !30189 +- Use stricter regex for broadcast target path. !30210 +- Change wording of merge request threads counter. !30217 +- Indicate topics are optional. !30264 (Ben Bodenmiller) +- Rename Client Side Evaluation to Live Preview. !30309 +- Decouple partial clone config from max input size. !30354 (Son Luong Ngoc) +- Update managed jupyter chart to 0.9.0 (stable). !30393 +- Hide broadcast messages until the end of the period. !30432 +- Add severity icons for alert management. !30472 +- Move to supported Elastic helm charts. !30528 +- Updated snippet view to show path instead of name for a blob. !30550 - Handle possible RSA key exceptions when generating CI_JOB_JWT. !30702 +- Update sidebar packages name. !30712 +- Update cron job schedule to have a random time generated on page load. !30729 +- Migrate Container-Scanning template to rules syntax. !30775 +- Migrate DAST CI template to rules syntax. !30776 +- Migrate License-Scanning CI template to rules syntax. !30784 +- Code review analytics: Change margin between title and description. !30834 +- Productivity Analytics: Remove separator and cleanup title margins. !30839 +- Move Auto DevOps Test.gitlab-ci.yml template to rules syntax instead of only/except. !30876 +- Change Var to Variable text. !30878 +- Move Build.gitlab-ci.yml to `rules` syntax. !30895 +- Move Code-Quality.gitlab-ci.yml to `rules` syntax. !30896 +- Migrate Dependency-Scanning CI template to rules syntax. !30907 +- Apply shared integrations view to project level. !30971 +- Exposes description, hosts, details, and timestamps for Alert Management Alert GraphQL. !31091 +- Update the example regex in the image expiration policy UI. !31104 +- Add clear explanation to the MR widget when no CI is available and Pipeline must succeed option is activated. !31112 +- Migrate SAST CI template to rules syntax. !31127 +- Update style of buttons on the Releases page. !31129 (Özgür Adem Işıklı @iozguradem) +- Changed test success calculation to exclude skipped tests. !31154 +- app:gitlab:check rake task now warns when projects are not in hashed storage. !31172 +- Moves embedded metrics for Prometheus alerts to Core. !31203 +- Move Deploy.gitlab-ci.yml to `rules` syntax. !31290 +- Modify Snippet git path errors to be more helpful. !31333 +- Move Browser-Perfomance-Testing.gitlab-ci.yml to `rules` syntax. !31413 +- Use gsub instead of the Liquid gem for variable substitution in the Prometheus proxy API. !31482 +- Changed terminology of security scanner status from configure to enable. !31503 +- Update auto-deploy-image to v0.14.0 with helm 2.16.6, --atomic deployments and improved kubernetes 1.16 support. !31505 +- Add ability to add or remove MR labels via API. !31522 (Lee Tickett) +- Disable Docker-in-Docker for Dependency Scanning by default. !31588 +- Disable Docker-in-Docker for SAST by default. !31589 +- Add migration to import changes to the system dashboard Prometheus queries into DB. !31618 +- Ensure links generated by the copy link feature contain variables. !31636 +- Migrate from Vue event hub to Mitt in issuables list. !31652 (Arun Kumar Mohan) +- URL params in the monitoring dashboard update variable values defined in yml file. !31662 +- Migrate from Vue event hub to Mitt. !31666 (Arun Kumar Mohan) +- Add prefix to template variables in URL in the monitoring dashboard. !31690 +- Add fields to GraphQL snippet blob type. !31710 +- Make protected_ci_variables setting enabled by default. !31715 +- Prepare group import feature to use ndjson. !31741 +- Prepare group export feature to use ndjson. !31742 +- Remove a lonely dot in Batch Comments. !31783 (Gilang Gumilar) +- Update auto-deploy-image to v0.15.0, with an upgraded PostgreSQL chart used by default for Auto DevOps deployments. !31799 +- Force hashed storage to always be enabled. !31801 +- Add alert counts by status to GraphQL API. !31818 +- Show warning message to user if raw text search is used when filtering pipelines. !31942 +- Update deprecated slot syntax in ./app/assets/javascripts/pages/milestones/shared/components/delete_milestone_modal.vue. !31990 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/confidential_merge_request/components/dropdown.vue. !31999 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/diffs/components/diff_discussions.vue. !32004 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/boards/components/board_form.vue. !32005 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/repository/components/breadcrumbs.vue. !32017 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/users/calendar_activities.html.haml. !32094 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/users/_deletion_guidance.html.haml. !32097 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_ref_dropdown.html.haml. !32102 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_recaptcha_form.html.haml. !32106 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_project_limit.html.haml. !32110 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_personal_access_tokens_table.html.haml. !32116 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_milestones_filter.html.haml. !32120 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_milestone_expired.html.haml. !32121 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_label_row.html.haml. !32124 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_group_tips.html.haml. !32127 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_group_form.html.haml. !32132 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_field.html.haml. !32136 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_delete_label_modal.html.haml. !32138 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/_commit_message_container.html.haml. !32139 (Gilang Gumilar) +- Externalize i18n aria-label strings from ./app/views/shared/*. !32142 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_top.html.haml. !32148 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_milestone.html.haml. !32154 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_merge_requests_tab.haml. !32158 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_labels_tab.html.haml. !32159 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_issues_tab.html.haml. !32160 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/milestones/_issuable.html.haml. !32161 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_sidebar.html.haml. !32164 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_nav.html.haml. !32165 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_label_*. !32167 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_close_reopen_report_toggle.html.haml. !32168 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_close_reopen_button.html.haml. !32172 (Gilang Gumilar) +- Externalize i18n strings from ./app/views/shared/issuable/_bulk_update_sidebar.html.haml. !32173 (Gilang Gumilar) +- Add files param to snippet create mutation. !32309 +- Cluster index refactor: Add missing pagination. !32338 +- Refactored render errors for blob to Vue. !32345 +- Format the alert payload into a table view. !32423 +- Add presence validation to content and title in snippet rest endpoints. !32522 +- Fix jump to definition linking to same file opening a new tab. + +### Performance (15 changes, 2 of them are from the community) + +- Speed up NOT Issue filters. !27639 +- Add indexes on ingress, enabled clusters and successful deployments. !28331 +- Add clusters index to improve usage data queries. !28626 +- Uses Kubernetes API conventions to create or update a resource leandrogs. !29010 (Leandro Silva) +- Cache TreeSummary response for logs_tree. !29828 +- Move release notification from model callbacks to service. !29853 (Ravishankar) +- Delete orphaned rows in application_settings table. !29981 +- Improve cacheability of monaco-editor code. !30032 +- Project import queries are now partially batched. !30057 +- Upgrade json gem to 2.3.0. !30852 +- Use process-wide cache for application settings and performance bar. !31135 +- Record usage ping finish time. !31222 +- Use NOT VALID to enforce a not null constraint on file store columns. !31261 +- Enable ref name caching for merge request diffs. !31530 +- Skip mergeability check when listing MRs in the API. !31890 + +### Added (146 changes, 13 of them are from the community) + +- Graphql query for issues can now be sorted by priority. !18901 +- Add test report API route. !24648 +- Add GraphQL support for querying a board's lists. !24812 +- Define remove_label quick action as alias of unlabel. !24962 (Jacopo Beschi @jacopo-beschi) +- Create Wiki activity events on pushes to Wiki git repository. !26624 +- Allow users to download a CSV of the recent daily code coverage values per job. !27094 +- Display x509 signed tags. !27211 (Roger Meier) +- Enabling git versioned snippets. !27705 +- Add option to hide the default "thumbs up" and "thumbs down" buttons on issues, merge requests, and snippets. !27734 (Steve Mokris) +- Add sorting issues by label priority to graphQL endpoint. !27936 +- Add certification revocation list download and certificate revoke. !28336 (Roger Meier) +- Add WebIDE Dark Theme Support. !28407 +- Add secure binaries template. !28566 +- LDAP authentication support for admin mode. !28572 (Diego Louzán) +- Add UI for exporting group data to the group settings. !28573 +- Allow to assign milestones to a release on the "Edit Release page". !28583 +- Add Previous and Next buttons for commit-by-commit navigation. !28596 +- Add the global var SECURE_ANALYZERS_PREFIX. !28617 +- Allow users to retry obtaining Let's Encrypt certificates for GitLab Pages. !28784 +- Add support for cluster applications CI artifact report. !28866 +- Add resource_state_events table. !28926 +- Migration to add partitioned_foreign_keys table that tracks foreign keys for partitioned tables. !29064 +- Collect object store config in usage data. !29149 +- Add freeze period model. !29162 +- Moved issue board focus mode to Core and available for for everyone. !29200 +- Add freeze periods via CI_DEPLOY_FREEZE variable. !29244 +- Add intermediate CAs capability to S/MIME email signature. !29352 (Diego Louzán) +- Add responding to ChatOps jobs triggered in Mattermost. !29366 (Brian Kintz) +- Expose Freeze Periods in REST API. !29382 +- Add read/write_package_registry to deploy_tokens. !29383 +- Add public API for feature flag user lists. !29415 +- Create cluster annotations API endpoint. !29502 +- Add ability to change metrics dashboard visibility. !29634 +- Add percentage of actors feature flag rollout. !29698 +- Add metric dashboard public visibility toggle. !29718 +- Route to feature flags based on internal id. !29740 +- Send email notification for unknown sign-ins. !29741 +- Add search by name to registry image repositories. !29763 +- Surface alerts add empty state. !29775 +- Enable uploadpack filters by default. !29787 +- Select the first option if there is only one metric option on alerts dropdown. !29857 (Gilang Gumilar) +- Add table for Alert Management alerts. !29864 +- Add policies for managing 'default_branch_protection' setting in groups. !29879 +- Add comment_detail column to services. !29891 +- Add option to add custom profile image guidelines. !29894 (Roger Meier) +- View a details of a panel in 'full screen mode'. !29902 +- Add database relation to preserve users starred metrics dashboard information. !29912 +- Add jira imports to usage data. !29925 +- Add issues_create_limit to settings api. !29960 +- Map labels from Jira to labels in GitLab. !29970 +- Add Deployment to ECS process to AutoDevOps. !29971 +- GraphQL issue queries can now be sorted by milestone due date. !29992 +- Add table for tracking issues published to status page. !29994 +- Create Sprints table and barebones model. !30125 +- When viewing a single panel, return to a full dashboard by pressing the Escape key. !30126 +- Flesh out Sprints relationships and constraints. !30127 +- Add GraphQL type for reading Alert Management Alerts. !30140 +- Add ability to query Projects using GraphQL API. !30146 +- Add `web_url` to branch API response. !30147 +- Fix Jira importer URLs. !30155 +- Add migrations for global CI variables. !30156 +- Add vue routes support to Static Site Editor. !30163 +- Integrate CI instance variables in the build process. !30186 +- Add raw_blob_request_limit to Application Settings API. !30211 +- Empty state for alerts list. !30215 +- Create operations_strategies_user_lists table. !30243 +- Adds URL parameter for confidential new issue creation. !30250 +- Update Jira comment to include more information. !30258 +- Add scheduled_at field to jira_imports table. !30284 +- Alerts list loading & error state. !30315 +- Deploy token authentication for API with Maven endpoints. !30332 +- Add metrics dashboard annotations feature, which enables marking interesting events over metrics dashboard charts. !30371 +- Add non_archived argument to issues API endpoint. !30381 +- Add admin controller actions for interacting with instance variables. !30385 +- Add mutation to create a new branch in GraphQL. !30388 +- Introduce API for fetching shared projects in a group. !30461 +- Display expanded dashboard from a panel's "Link to chart" URL. !30476 +- Resolve Design Comment: Edit Comment text. !30479 +- Map Jira issue assignee and author. !30498 +- Add email notification on group export complete. !30522 +- Add option to restrict emails that match a configured regular expression. !30548 +- In metrics dashboard use custom variables from URL in queries. !30560 +- Add mutation for AlertManagement's Alert status. !30576 +- Multiple metrics edit navigates to prom edit page. !30666 +- Update metrics dashboard url when a panel is expanded or contracted. !30704 +- Add migration bot user. !30738 +- Issues Analytics: Add title to page. !30836 +- Contribution Analytics: Add title to page. !30842 +- Insights Analytics: Add title to page. !30853 +- Repository Analytics: Add title to page. !30855 +- CI / CD Analytics: Add title to page. !30891 +- Enable Monaco for editing Snippets by default. !30892 +- Disabled Edit button for binary snippets. !30904 +- Monokai and Solarized Dark syntax highlighting theme for Web IDE. !30931 +- Updated deprecated buttons in release page. !30941 (Özgür Adem Işıklı @iozguradem) +- Add sorting to AlertManagement Alert Graphql. !30964 +- Web IDE: Introduce syntax highlighting for .vue files. !30986 +- Solarized light syntax highlighting theme for the Web IDE. !30989 +- Deploy tokens can be used in the API with Basic Auth Headers enabling NuGet and PyPI to be used with deploy tokens. !31035 +- Skip spam check for GitLab team members on gitlab.com. !31052 +- None syntax highlighting theme for Web IDE. !31056 +- Issues Analytics: Add title to group-level page. !31057 +- Display metrics dashboards starred by user at the top of dashboard select field. !31059 +- Add WYSIWYG editor to the Static Site Editor. !31099 +- Conan registry is accessible using deploy tokens. !31114 +- Add container registry settings to application_settings table. !31125 +- Added provider icon to cluster index display. !31134 +- Add a CI variable CI_KUBERNETES_ACTIVE as an alternative to only:kubernetes/except:kubernetes that works with the rules syntax. !31146 +- Enable Alert Management functionality. !31171 +- Allow monitoring dashboard users to open single panels in a new tab. !31206 +- Create dashboard annotations via Graphql. !31249 +- Enable deploy token authentication for the NPM registry. !31264 +- Add read and write package registry scopes to deploy tokens. !31267 +- Read only storage move API. !31285 +- Add Design Management (via Designs tab on Issues) to GitLab FOSS. !31309 +- Exposes issue IID in Alert Management Alert's GraphQL endpoint. !31313 +- New API endpoint for starring metrics dashboards. !31316 +- Add search bar to container registry image list. !31322 +- Highlight focused Design discussion in image markers. !31323 +- Allow showing merge request diffs compared to current version of target branch. !31325 +- Add alert on project issues page to show Jira import is in progress. !31329 +- Add API CRUD actions for instance-level CI/CD variables. !31342 +- Add alert on project issues page to show Jira import has finished. !31375 +- Filter pipelines by trigger author and branch name. !31386 +- Add incident_labeled_issues to usage ping. !31406 +- Refactored Snippet view to Vue. !31450 +- Make report-type artifacts available for download. !31513 +- Render dropdown and text elements based on variables defined in monitoring dashboard yml file. !31524 +- Add expunge deleted messages option to mailroom. !31531 (Diego Louzán) +- Log Cloudflare request headers. !31532 +- Allow Web IDE markdown to preview uncommitted images. !31540 +- Add Webex Teams project integration service. !31543 (Sebastian Leuser) +- Add Rubocop cop to flag keyword arguments usage in Sidekiq workers. !31551 (Arun Kumar Mohan) +- Allow users to star/unstar dashboards which will appear at the top of their dashboards options. !31597 +- Add ability to create merge request from vulnerability page. !31620 +- Add confidential status support for comment and replies. !31622 +- Add Web IDE pipelines usage counter. !31658 +- Ruby metrics now include USS and PSS memory readings. !31707 +- Add issues_created_gitlab_alerts to usage ping. !31802 +- Add Alert Detail view. !31877 +- New API endpoint for removing stars from metrics dashboards. !31892 +- View raw file of any zip artifacts. !31912 +- Add search to Alert Management Alerts GraphQL query. !32047 +- Add "Keep divergent refs" option for push mirrors. !32381 +- Add fields to Alert Details view. !32392 +- Update GitLab Pages to 1.18.0. + +### Other (70 changes, 25 of them are from the community) + +- Remove Admin -> Settings -> Geo navigation. !21005 (Lee Tickett) +- removes store logic from issue board models. !21400 (nuwe1) +- removes store logic from issue board models. !21408 (nuwe1) +- Moves updateIssue from issue model to board store. !21414 (nuwe1) +- Improve error handling of squash and rebase. !23740 +- Remove obsolete bot_type column. !27076 +- Remove obsolete columns from resource_milestone_events. !28536 +- Add index to issue_id and created_at of resource_weight_events. !28930 +- Clean up & Re-arrange the keyboard shortcuts modal. !28992 +- Remove ci_expose_arbitrary_artifacts_in_mr feature flag. !29363 (Lee Tickett) +- Remove git_archive_path feature flag. !29369 (Lee Tickett) +- Rename Snippet search results title. !29599 +- Update to Rails 6.0.2.2. !29743 +- Log server responses of API bad requests in api_json.log. !29839 +- Clean up refresh fix for cancel automatic merge. !29844 +- Add snippet repository backfilling migration. !29927 +- Remove the SIDEKIQ_REQUEST_STORE configuration. !29955 +- Increase label list label column width. !29963 +- Refactor count queries to single query on Projects::EnvironmentsController. !30073 (Sashi Kumar) +- Update text on self-managed sign in page. !30135 +- Remove namespaces.plan_id column. !30351 +- Migrate models and policies specs to consider admin mode. !30430 (Diego Louzán) +- Upgrade Nokogiri to v1.10.9. !30435 +- Add snippet migration rake tasks. !30489 +- Error tracking target blank empty state. !30525 +- Remove elasticsearch_experimental_indexer column. !30628 +- Update the template for Static Site Editor / Middleman. !30642 +- Remove unused cluster configuration workers. !30695 +- Remove deprecated Snippet `code` attribute from Project Snippets API. !30739 +- Update merge request widget question mark icons. !30759 +- Value Stream Analytics: Add title and remove separator. !30841 +- Remove mention of github-markup in Wiki clone help. !30962 +- Alert Management mobile styling. !31082 +- Allow Auto DevOps Test stage to start immediately. !31185 +- Enable async_merge_request_check_mergeability by default. !31196 +- Cleanup background migration for populating user_highest_roles table. !31218 +- Add docs for alert management list. !31225 +- Remove extra spaces from markdown toolbar items. !31288 +- Use cookies with metadata to prevent reuse as another cookie. !31311 +- Add inherit_from_id column to services table. !31320 +- Organize package models by package type. !31346 (Sashi Kumar) +- Apply active class on active link element in HAML pagination. !31396 +- Update GitLab Runner Helm Chart to 0.16.1. !31492 +- Log when container registry permissions are denied. !31536 +- Add epic_id to resource_state_events. !31587 +- Update doorkeeper to latest version 5.0.3. !31673 +- Add Foreign Key on projects.namespaces_id. !31675 +- Fix misalignment of author dropdown on the commits search page. !31686 +- Update css-loader ^1.0.0 -> ^2.1.1. !31743 (Pirate Praveen) +- Fix database schema inconsistency with not-null checks. !31930 +- Removes create_confidential_merge_request feature flag leandrogs. !31968 (Leandro Silva) +- Update deprecated slot syntax in ./app/assets/javascripts/issue_show/components/fields/description.vue. !31979 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/pages/milestones/shared/components/promote_milestone_modal.vue. !31980 (Gilang Gumilar) +- Update group and project export info messages. !31981 (briankabiro) +- Relocate Nuget presenter helpers to presenters module. !31985 (Sashi Kumar) +- Update deprecated slot syntax in ./app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue. !31992 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/performance_bar/components/detailed_metric.vue. !32006 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/profile/account/components/delete_account_modal.vue. !32007 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/environments/components/stop_environment_modal.vue. !32012 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/serverless/components/area.vue. !32015 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/releases/components/app_edit.vue. !32018 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/releases/components/evidence_block.vue. !32019 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/ide/components/ide_review.vue. !32025 (Gilang Gumilar) +- Update deprecated slot syntax in ./app/assets/javascripts/ide/components/pipelines/list.vue. !32027 (Gilang Gumilar) +- Update alert management table background colour to correct gray. !32068 +- Validate package types in package metadatum models. !32091 (Sashi Kumar) +- Update error tracking table background colour to correct gray. !32133 +- Update GitLab Elasticsearch Indexer to v2.3.0. !32199 +- Update asciidoctor-plantuml gem to v0.0.12. !32376 +- Use visitUrl in Alert management. !32414 + + +## 12.10.5 (2020-05-13) + +### Added (1 change) + +- Consider project group and group ancestors when processing CODEOWNERS entries. !31804 + + +## 12.10.4 (2020-05-05) + +### Fixed (1 change) + +- Add a Project's group to list of groups when parsing for codeowner entries. !30934 ## 12.10.2 (2020-04-30) @@ -493,6 +1060,28 @@ entry. - Remove store_mentions! in Snippets::CreateService. !29581 (Sashi Kumar) +## 12.9.6 (2020-05-05) + +### Fixed (1 change) + +- Add a Project's group to list of groups when parsing for codeowner entries. !30934 + + +## 12.9.5 (2020-04-30) + +### Security (9 changes) + +- Ensure MR diff exists before codeowner check. +- Apply CODEOWNERS validations to web requests. +- Prevent unauthorized access to default branch. +- Do not return private project ID without permission. +- Fix doorkeeper CVE-2020-10187. +- Prevent ES credentials leak. +- Change GitHub service integration token input to password. +- Return only safe urls for mirrors. +- Validate workhorse 'rewritten_fields' and properly use them during multipart uploads. + + ## 12.9.4 (2020-04-16) - No changes. @@ -1011,6 +1600,19 @@ entry. - Improvement in token reference. +## 12.8.10 (2020-04-30) + +### Security (7 changes) + +- Ensure MR diff exists before codeowner check. +- Prevent unauthorized access to default branch. +- Do not return private project ID without permission. +- Fix doorkeeper CVE-2020-10187. +- Prevent ES credentials leak. +- Return only safe urls for mirrors. +- Validate workhorse 'rewritten_fields' and properly use them during multipart uploads. + + ## 12.8.9 (2020-04-14) ### Security (3 changes) diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 060a56a063..02161ca86e 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -12.10.3 +13.0.0 diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION index ccbccc3dc6..276cbf9e28 100644 --- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION +++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION @@ -1 +1 @@ -2.2.0 +2.3.0 diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION index 092afa15df..84cc529467 100644 --- a/GITLAB_PAGES_VERSION +++ b/GITLAB_PAGES_VERSION @@ -1 +1 @@ -1.17.0 +1.18.0 diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index 685332623b..67aee23940 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -12.2.0 +13.2.0 diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION index 57b9fc187c..2f70731b8a 100644 --- a/GITLAB_WORKHORSE_VERSION +++ b/GITLAB_WORKHORSE_VERSION @@ -1 +1 @@ -8.30.1 +8.31.0 diff --git a/Gemfile b/Gemfile index d15628eb83..9c8c5e8b30 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails', '6.0.2' +gem 'rails', '~> 6.0.3' gem 'bootsnap', '~> 1.4.6' @@ -26,7 +26,7 @@ gem 'marginalia', '~> 1.8.0' # Authentication libraries gem 'devise', '~> 4.6' -gem 'doorkeeper', '~> 5.0.2' +gem 'doorkeeper', '~> 5.0.3' gem 'doorkeeper-openid_connect', '~> 1.6.3' gem 'omniauth', '~> 1.8' gem 'omniauth-auth0', '~> 2.0.0' @@ -138,7 +138,7 @@ gem 'faraday_middleware-aws-signers-v4' # Markdown and HTML processing gem 'html-pipeline', '~> 2.12' gem 'deckar01-task_list', '2.3.1' -gem 'gitlab-markup', '~> 1.7.0' +gem 'gitlab-markup', '~> 1.7.1' gem 'github-markup', '~> 1.7.0', require: 'github/markup' gem 'commonmarker', '~> 0.20' gem 'RedCloth', '~> 4.3.2' @@ -148,11 +148,11 @@ gem 'creole', '~> 0.5.0' gem 'wikicloth', '0.8.1' gem 'asciidoctor', '~> 2.0.10' gem 'asciidoctor-include-ext', '~> 0.3.1', require: false -gem 'asciidoctor-plantuml', '0.0.10' -gem 'rouge', '~> 3.18.0' +gem 'asciidoctor-plantuml', '~> 0.0.12' +gem 'rouge', '~> 3.19.0' gem 'truncato', '~> 0.7.11' gem 'bootstrap_form', '~> 4.2.0' -gem 'nokogiri', '~> 1.10.5' +gem 'nokogiri', '~> 1.10.9' gem 'escape_utils', '~> 1.1' # Calendar rendering @@ -166,7 +166,7 @@ gem 'diff_match_patch', '~> 0.1.0' gem 'rack', '~> 2.0.9' group :unicorn do - gem 'unicorn', '~> 5.4.1' + gem 'unicorn', '~> 5.5' gem 'unicorn-worker-killer', '~> 0.4.4' end @@ -204,7 +204,7 @@ gem 'ruby-progressbar' gem 'settingslogic', '~> 2.0.9' # Linear-time regex library for untrusted regular expressions -gem 're2', '~> 1.1.1' +gem 're2', '~> 1.2.0' # Misc @@ -230,7 +230,7 @@ gem 'discordrb-webhooks-blackst0ne', '~> 3.3', require: false gem 'hipchat', '~> 1.5.0' # Jira integration -gem 'jira-ruby', '~> 1.7' +gem 'jira-ruby', '~> 2.0.0' gem 'atlassian-jwt', '~> 0.2.0' # Flowdock integration @@ -287,13 +287,13 @@ gem 'addressable', '~> 2.7' gem 'font-awesome-rails', '~> 4.7' gem 'gemojione', '~> 3.3' gem 'gon', '~> 6.2' -gem 'request_store', '~> 1.3' +gem 'request_store', '~> 1.5' gem 'base32', '~> 0.3.0' gem "gitlab-license", "~> 1.0" # Protect against bruteforcing -gem 'rack-attack', '~> 6.2.0' +gem 'rack-attack', '~> 6.3.0' # Sentry integration gem 'sentry-raven', '~> 2.9' @@ -318,13 +318,9 @@ gem 'peek', '~> 1.1' # Snowplow events tracking gem 'snowplow-tracker', '~> 0.6.1' -# Memory benchmarks -gem 'derailed_benchmarks', require: false - # Metrics group :metrics do gem 'method_source', '~> 0.8', require: false - gem 'influxdb', '~> 0.2', require: false # Prometheus gem 'prometheus-client-mmap', '~> 0.10.0' @@ -355,7 +351,7 @@ group :development, :test do gem 'database_cleaner', '~> 1.7.0' gem 'factory_bot_rails', '~> 5.1.0' - gem 'rspec-rails', '~> 4.0.0.beta4' + gem 'rspec-rails', '~> 4.0.0' # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826) gem 'minitest', '~> 5.11.0' @@ -414,12 +410,15 @@ group :test do gem 'test-prof', '~> 0.10.0' gem 'rspec_junit_formatter' gem 'guard-rspec' + + # Moved in `test` because https://gitlab.com/gitlab-org/gitlab/-/issues/217527 + gem 'derailed_benchmarks', require: false end gem 'octokit', '~> 4.15' # https://gitlab.com/gitlab-org/gitlab/issues/207207 -gem 'gitlab-mail_room', '~> 0.0.3', require: 'mail_room' +gem 'gitlab-mail_room', '~> 0.0.4', require: 'mail_room' gem 'email_reply_trimmer', '~> 0.1' gem 'html2text' @@ -445,7 +444,7 @@ gem 'sys-filesystem', '~> 1.1.6' gem 'net-ntp' # SSH host key support -gem 'net-ssh', '~> 5.2' +gem 'net-ssh', '~> 6.0' gem 'sshkey', '~> 2.0' # Required for ED25519 SSH host key support @@ -455,7 +454,7 @@ group :ed25519 do end # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 12.9.0.pre.rc4' +gem 'gitaly', '~> 13.0.0.pre.rc1' gem 'grpc', '~> 1.24.0' @@ -481,8 +480,6 @@ gem 'countries', '~> 3.0' gem 'retriable', '~> 3.1.2' -gem 'liquid', '~> 4.0' - # LRU cache gem 'lru_redux' @@ -495,3 +492,9 @@ gem 'mail', '= 2.7.1' # File encryption gem 'lockbox', '~> 0.3.3' + +# Email validation +gem 'valid_email', '~> 0.1' + +# JSON +gem 'json', '~> 2.3.0' diff --git a/Gemfile.lock b/Gemfile.lock index 64bf4ec44d..ffff576e8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -6,64 +6,64 @@ GEM ace-rails-ap (4.1.2) acme-client (2.0.5) faraday (~> 0.9, >= 0.9.1) - actioncable (6.0.2) - actionpack (= 6.0.2) + actioncable (6.0.3) + actionpack (= 6.0.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.2) - actionpack (= 6.0.2) - activejob (= 6.0.2) - activerecord (= 6.0.2) - activestorage (= 6.0.2) - activesupport (= 6.0.2) + actionmailbox (6.0.3) + actionpack (= 6.0.3) + activejob (= 6.0.3) + activerecord (= 6.0.3) + activestorage (= 6.0.3) + activesupport (= 6.0.3) mail (>= 2.7.1) - actionmailer (6.0.2) - actionpack (= 6.0.2) - actionview (= 6.0.2) - activejob (= 6.0.2) + actionmailer (6.0.3) + actionpack (= 6.0.3) + actionview (= 6.0.3) + activejob (= 6.0.3) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.2) - actionview (= 6.0.2) - activesupport (= 6.0.2) - rack (~> 2.0) + actionpack (6.0.3) + actionview (= 6.0.3) + activesupport (= 6.0.3) + rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.2) - actionpack (= 6.0.2) - activerecord (= 6.0.2) - activestorage (= 6.0.2) - activesupport (= 6.0.2) + actiontext (6.0.3) + actionpack (= 6.0.3) + activerecord (= 6.0.3) + activestorage (= 6.0.3) + activesupport (= 6.0.3) nokogiri (>= 1.8.5) - actionview (6.0.2) - activesupport (= 6.0.2) + actionview (6.0.3) + activesupport (= 6.0.3) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.2) - activesupport (= 6.0.2) + activejob (6.0.3) + activesupport (= 6.0.3) globalid (>= 0.3.6) - activemodel (6.0.2) - activesupport (= 6.0.2) - activerecord (6.0.2) - activemodel (= 6.0.2) - activesupport (= 6.0.2) + activemodel (6.0.3) + activesupport (= 6.0.3) + activerecord (6.0.3) + activemodel (= 6.0.3) + activesupport (= 6.0.3) activerecord-explain-analyze (0.1.0) activerecord (>= 4) pg - activestorage (6.0.2) - actionpack (= 6.0.2) - activejob (= 6.0.2) - activerecord (= 6.0.2) + activestorage (6.0.3) + actionpack (= 6.0.3) + activejob (= 6.0.3) + activerecord (= 6.0.3) marcel (~> 0.3.1) - activesupport (6.0.2) + activesupport (6.0.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - zeitwerk (~> 2.2) + zeitwerk (~> 2.2, >= 2.2.2) acts-as-taggable-on (6.5.0) activerecord (>= 5.0, < 6.1) adamantium (0.2.0) @@ -84,7 +84,7 @@ GEM asciidoctor (2.0.10) asciidoctor-include-ext (0.3.1) asciidoctor (>= 1.5.6, < 3.0.0) - asciidoctor-plantuml (0.0.10) + asciidoctor-plantuml (0.0.12) asciidoctor (>= 1.5.6, < 3.0.0) ast (2.4.0) atlassian-jwt (0.2.0) @@ -153,7 +153,6 @@ GEM activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) - cause (0.1) character_set (1.1.2) charlock_holmes (0.7.6) childprocess (3.0.0) @@ -245,7 +244,7 @@ GEM docile (1.3.2) domain_name (0.5.20180417) unf (>= 0.0.5, < 1.0.0) - doorkeeper (5.0.2) + doorkeeper (5.0.3) railties (>= 4.2) doorkeeper-openid_connect (1.6.3) doorkeeper (>= 5.0, < 5.2) @@ -378,7 +377,7 @@ GEM po_to_json (>= 1.0.0) rails (>= 3.2.0) git (1.5.0) - gitaly (12.9.0.pre.rc4) + gitaly (13.0.0.pre.rc1) grpc (~> 1.0) github-markup (1.7.0) gitlab-chronic (0.10.5) @@ -391,8 +390,8 @@ GEM opentracing (~> 0.4) redis (> 3.0.0, < 5.0.0) gitlab-license (1.0.0) - gitlab-mail_room (0.0.3) - gitlab-markup (1.7.0) + gitlab-mail_room (0.0.4) + gitlab-markup (1.7.1) gitlab-net-dns (0.9.1) gitlab-puma (4.3.3.gitlab.2) nio4r (~> 2.0) @@ -535,9 +534,6 @@ GEM i18n_data (0.8.0) icalendar (2.4.1) ice_nine (0.11.2) - influxdb (0.2.3) - cause - json invisible_captcha (0.12.1) rails (>= 3.2.0) ipaddress (0.8.3) @@ -545,7 +541,7 @@ GEM opentracing (~> 0.3) thrift jaro_winkler (1.5.4) - jira-ruby (1.7.1) + jira-ruby (2.0.0) activesupport atlassian-jwt multipart-post @@ -555,7 +551,7 @@ GEM character_set (~> 1.1) regexp_parser (~> 1.1) regexp_property_values (~> 0.3) - json (1.8.6) + json (2.3.0) json-jwt (1.11.0) activesupport (>= 4.2) aes_key_wrap @@ -575,7 +571,7 @@ GEM activerecord kaminari-core (= 1.0.1) kaminari-core (1.0.1) - kgio (2.11.2) + kgio (2.11.3) knapsack (1.17.0) rake kramdown (2.1.0) @@ -602,7 +598,6 @@ GEM xml-simple licensee (8.9.2) rugged (~> 0.24) - liquid (4.0.3) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -614,7 +609,7 @@ GEM activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.4.0) + loofah (2.5.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) lru_redux (1.1.0) @@ -634,7 +629,7 @@ GEM mime-types (3.2.2) mime-types-data (~> 3.2015) mime-types-data (3.2019.0331) - mimemagic (0.3.3) + mimemagic (0.3.5) mini_histogram (0.1.3) mini_magick (4.9.5) mini_mime (1.0.2) @@ -653,11 +648,11 @@ GEM nenv (0.3.0) net-ldap (0.16.2) net-ntp (2.1.3) - net-ssh (5.2.0) + net-ssh (6.0.0) netrc (0.11.0) nio4r (2.5.2) no_proxy_fix (0.1.2) - nokogiri (1.10.8) + nokogiri (1.10.9) mini_portile2 (~> 2.4.0) nokogumbo (1.5.0) nokogiri @@ -791,7 +786,7 @@ GEM rack (2.0.9) rack-accept (0.4.5) rack (>= 0.4) - rack-attack (6.2.0) + rack-attack (6.3.0) rack (>= 1.0, < 3) rack-cors (1.0.6) rack (>= 1.6.0) @@ -808,20 +803,20 @@ GEM rack-test (1.1.0) rack (>= 1.0, < 3) rack-timeout (0.5.1) - rails (6.0.2) - actioncable (= 6.0.2) - actionmailbox (= 6.0.2) - actionmailer (= 6.0.2) - actionpack (= 6.0.2) - actiontext (= 6.0.2) - actionview (= 6.0.2) - activejob (= 6.0.2) - activemodel (= 6.0.2) - activerecord (= 6.0.2) - activestorage (= 6.0.2) - activesupport (= 6.0.2) + rails (6.0.3) + actioncable (= 6.0.3) + actionmailbox (= 6.0.3) + actionmailer (= 6.0.3) + actionpack (= 6.0.3) + actiontext (= 6.0.3) + actionview (= 6.0.3) + activejob (= 6.0.3) + activemodel (= 6.0.3) + activerecord (= 6.0.3) + activestorage (= 6.0.3) + activesupport (= 6.0.3) bundler (>= 1.3.0) - railties (= 6.0.2) + railties (= 6.0.3) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.4) actionpack (>= 5.0.1.x) @@ -835,14 +830,14 @@ GEM rails-i18n (6.0.0) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 7) - railties (6.0.2) - actionpack (= 6.0.2) - activesupport (= 6.0.2) + railties (6.0.3) + actionpack (= 6.0.3) + activesupport (= 6.0.3) method_source rake (>= 0.8.7) thor (>= 0.20.3, < 2.0) rainbow (3.0.0) - raindrops (0.19.0) + raindrops (0.19.1) rake (12.3.3) rb-fsevent (0.10.2) rb-inotify (0.9.10) @@ -854,10 +849,10 @@ GEM msgpack (>= 0.4.3) optimist (>= 3.0.0) rdoc (6.1.2) - re2 (1.1.1) + re2 (1.2.0) recaptcha (4.13.1) json - recursive-open-struct (1.1.0) + recursive-open-struct (1.1.1) redis (4.1.3) redis-actionpack (5.2.0) actionpack (>= 5, < 7) @@ -883,7 +878,8 @@ GEM declarative (< 0.1.0) declarative-option (< 0.2.0) uber (< 0.2.0) - request_store (1.3.1) + request_store (1.5.0) + rack (>= 1.4) responders (3.0.0) actionpack (>= 5.0) railties (>= 5.0) @@ -894,7 +890,7 @@ GEM retriable (3.1.2) rinku (2.0.0) rotp (2.1.2) - rouge (3.18.0) + rouge (3.19.0) rqrcode (0.7.0) chunky_png rqrcode-rails3 (0.1.7) @@ -905,7 +901,7 @@ GEM rspec-mocks (~> 3.9.0) rspec-core (3.9.1) rspec-support (~> 3.9.1) - rspec-expectations (3.9.0) + rspec-expectations (3.9.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.9.0) rspec-mocks (3.9.1) @@ -917,7 +913,7 @@ GEM proc_to_ast rspec (>= 2.13, < 4) unparser - rspec-rails (4.0.0.beta4) + rspec-rails (4.0.0) actionpack (>= 4.2) activesupport (>= 4.2) railties (>= 4.2) @@ -1077,7 +1073,7 @@ GEM truncato (0.7.11) htmlentities (~> 4.3.1) nokogiri (>= 1.7.0, <= 2.0) - tzinfo (1.2.6) + tzinfo (1.2.7) thread_safe (~> 0.1) u2f (0.2.1) uber (0.1.0) @@ -1091,7 +1087,7 @@ GEM unicode_plot (0.0.4) enumerable-statistics (>= 2.0.1) unicode_utils (1.4.0) - unicorn (5.4.1) + unicorn (5.5.5) kgio (~> 2.6) raindrops (~> 0.7) unicorn-worker-killer (0.4.4) @@ -1108,6 +1104,9 @@ GEM equalizer (~> 0.0.9) parser (>= 2.6.5) procto (~> 0.0.2) + valid_email (0.1.3) + activemodel + mail (>= 2.6.1) validate_email (0.1.6) activemodel (>= 3.0) mail (>= 2.2.5) @@ -1146,7 +1145,7 @@ GEM xml-simple (1.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.2.2) + zeitwerk (2.3.0) PLATFORMS ruby @@ -1163,7 +1162,7 @@ DEPENDENCIES asana (~> 0.9) asciidoctor (~> 2.0.10) asciidoctor-include-ext (~> 0.3.1) - asciidoctor-plantuml (= 0.0.10) + asciidoctor-plantuml (~> 0.0.12) atlassian-jwt (~> 0.2.0) attr_encrypted (~> 3.1.0) awesome_print @@ -1202,7 +1201,7 @@ DEPENDENCIES diff_match_patch (~> 0.1.0) diffy (~> 3.3) discordrb-webhooks-blackst0ne (~> 3.3) - doorkeeper (~> 5.0.2) + doorkeeper (~> 5.0.3) doorkeeper-openid_connect (~> 1.6.3) ed25519 (~> 1.2) elasticsearch-api (~> 6.8) @@ -1235,13 +1234,13 @@ DEPENDENCIES gettext (~> 3.2.2) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.3) - gitaly (~> 12.9.0.pre.rc4) + gitaly (~> 13.0.0.pre.rc1) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) gitlab-labkit (= 0.12.0) gitlab-license (~> 1.0) - gitlab-mail_room (~> 0.0.3) - gitlab-markup (~> 1.7.0) + gitlab-mail_room (~> 0.0.4) + gitlab-markup (~> 1.7.1) gitlab-net-dns (~> 0.9.1) gitlab-puma (~> 4.3.3.gitlab.2) gitlab-puma_worker_killer (~> 0.1.1.gitlab.1) @@ -1273,10 +1272,10 @@ DEPENDENCIES html2text httparty (~> 0.16.4) icalendar - influxdb (~> 0.2) invisible_captcha (~> 0.12.1) - jira-ruby (~> 1.7) + jira-ruby (~> 2.0.0) js_regex (~> 3.1) + json (~> 2.3.0) json-schema (~> 2.8.0) jwt (~> 2.1.0) kaminari (~> 1.0) @@ -1285,7 +1284,6 @@ DEPENDENCIES letter_opener_web (~> 1.3.4) license_finder (~> 5.4) licensee (~> 8.9) - liquid (~> 4.0) lockbox (~> 0.3.3) lograge (~> 0.5) loofah (~> 2.2) @@ -1300,8 +1298,8 @@ DEPENDENCIES nakayoshi_fork (~> 0.0.4) net-ldap net-ntp - net-ssh (~> 5.2) - nokogiri (~> 1.10.5) + net-ssh (~> 6.0) + nokogiri (~> 1.10.9) oauth2 (~> 1.4) octokit (~> 4.15) omniauth (~> 1.8) @@ -1332,12 +1330,12 @@ DEPENDENCIES pry-byebug (~> 3.5.1) pry-rails (~> 0.3.9) rack (~> 2.0.9) - rack-attack (~> 6.2.0) + rack-attack (~> 6.3.0) rack-cors (~> 1.0.6) rack-oauth2 (~> 1.9.3) rack-proxy (~> 0.6.0) rack-timeout - rails (= 6.0.2) + rails (~> 6.0.3) rails-controller-testing rails-i18n (~> 6.0) rainbow (~> 3.0) @@ -1345,18 +1343,18 @@ DEPENDENCIES rblineprof (~> 0.3.6) rbtrace (~> 0.4) rdoc (~> 6.1.2) - re2 (~> 1.1.1) + re2 (~> 1.2.0) recaptcha (~> 4.11) redis (~> 4.0) redis-namespace (~> 1.6.0) redis-rails (~> 5.0.2) - request_store (~> 1.3) + request_store (~> 1.5) responders (~> 3.0) retriable (~> 3.1.2) - rouge (~> 3.18.0) + rouge (~> 3.19.0) rqrcode-rails3 (~> 0.1.7) rspec-parameterized - rspec-rails (~> 4.0.0.beta4) + rspec-rails (~> 4.0.0) rspec-retry (~> 0.6.1) rspec_junit_formatter rspec_profiling (~> 0.0.5) @@ -1398,9 +1396,10 @@ DEPENDENCIES u2f (~> 0.2.1) uglifier (~> 2.7.2) unf (~> 0.1.4) - unicorn (~> 5.4.1) + unicorn (~> 5.5) unicorn-worker-killer (~> 0.4.4) unleash (~> 0.1.5) + valid_email (~> 0.1) validates_hostname (~> 1.0.6) version_sorter (~> 2.2.4) vmstat (~> 2.3.0) diff --git a/Guardfile b/Guardfile index 21ee2a9d61..baaa52bd20 100644 --- a/Guardfile +++ b/Guardfile @@ -2,28 +2,51 @@ # More info at https://github.com/guard/guard#readme +require "guard/rspec/dsl" + cmd = ENV['GUARD_CMD'] || (ENV['SPRING'] ? 'spring rspec' : 'bundle exec rspec') -guard :rspec, cmd: cmd do - require "guard/rspec/dsl" - dsl = Guard::RSpec::Dsl.new(self) +directories %w(app ee lib spec) - directories %w(app ee lib spec) +rspec_context_for = proc do |context_path| + OpenStruct.new(to_s: "spec").tap do |rspec| + rspec.spec_dir = "#{context_path}spec" + rspec.spec = ->(m) { Guard::RSpec::Dsl.detect_spec_file_for(rspec, m) } + rspec.spec_helper = "#{rspec.spec_dir}/spec_helper.rb" + rspec.spec_files = %r{^#{rspec.spec_dir}/.+_spec\.rb$} + rspec.spec_support = %r{^#{rspec.spec_dir}/support/(.+)\.rb$} + end +end +rails_context_for = proc do |context_path, exts| + OpenStruct.new.tap do |rails| + rails.app_files = %r{^#{context_path}app/(.+)\.rb$} + + rails.views = %r{^#{context_path}app/(views/.+/[^/]*\.(?:#{exts}))$} + rails.view_dirs = %r{^#{context_path}app/views/(.+)/[^/]*\.(?:#{exts})$} + rails.layouts = %r{^#{context_path}app/layouts/(.+)/[^/]*\.(?:#{exts})$} + + rails.controllers = %r{^#{context_path}app/controllers/(.+)_controller\.rb$} + rails.routes = "#{context_path}config/routes.rb" + rails.app_controller = "#{context_path}app/controllers/application_controller.rb" + rails.spec_helper = "#{context_path}spec/rails_helper.rb" + end +end + +guard_setup = proc do |context_path| # RSpec files - rspec = dsl.rspec + rspec = rspec_context_for.call(context_path) watch(rspec.spec_helper) { rspec.spec_dir } watch(rspec.spec_support) { rspec.spec_dir } watch(rspec.spec_files) # Ruby files - ruby = dsl.ruby - dsl.watch_spec_files_for(ruby.lib_files) + watch(%r{^#{context_path}(lib/.+)\.rb$}) { |m| rspec.spec.call(m[1]) } # Rails files - rails = dsl.rails(view_extensions: %w(erb haml slim)) - dsl.watch_spec_files_for(rails.app_files) - dsl.watch_spec_files_for(rails.views) + rails = rails_context_for.call(context_path, %w(erb haml slim)) + watch(rails.app_files) { |m| rspec.spec.call(m[1]) } + watch(rails.views) { |m| rspec.spec.call(m[1]) } watch(rails.controllers) do |m| [ @@ -41,3 +64,11 @@ guard :rspec, cmd: cmd do watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") } watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") } end + +context_paths = ['', 'ee/'] + +context_paths.each do |context_path| + guard :rspec, cmd: cmd, spec_paths: ["#{context_path}spec/"] do + guard_setup.call(context_path) + end +end diff --git a/README.md b/README.md index 1372e47d52..51a54c3bbf 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ GitLab is a Ruby on Rails application that runs on the following software: - Ruby (MRI) 2.6.5 - Git 2.8.4+ - Redis 2.8+ -- PostgreSQL 9.6+ +- PostgreSQL 11+ For more information please see the [architecture](https://docs.gitlab.com/ee/development/architecture.html) and [requirements](https://docs.gitlab.com/ee/install/requirements.html) documentation. diff --git a/VERSION b/VERSION index 060a56a063..02161ca86e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -12.10.3 +13.0.0 diff --git a/app/assets/images/cluster_app_logos/fluentd.png b/app/assets/images/cluster_app_logos/fluentd.png new file mode 100644 index 0000000000..6d42578f2c Binary files /dev/null and b/app/assets/images/cluster_app_logos/fluentd.png differ diff --git a/app/assets/javascripts/access_tokens/components/expires_at_field.vue b/app/assets/javascripts/access_tokens/components/expires_at_field.vue new file mode 100644 index 0000000000..d0932ad80e --- /dev/null +++ b/app/assets/javascripts/access_tokens/components/expires_at_field.vue @@ -0,0 +1,14 @@ + + + diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js new file mode 100644 index 0000000000..9bdb294095 --- /dev/null +++ b/app/assets/javascripts/access_tokens/index.js @@ -0,0 +1,12 @@ +import Vue from 'vue'; +import ExpiresAtField from './components/expires_at_field.vue'; + +const initExpiresAtField = () => { + // eslint-disable-next-line no-new + new Vue({ + el: document.querySelector('.js-access-tokens-expires-at'), + components: { ExpiresAtField }, + }); +}; + +export default initExpiresAtField; diff --git a/app/assets/javascripts/actioncable_consumer.js b/app/assets/javascripts/actioncable_consumer.js new file mode 100644 index 0000000000..5658ffc1a3 --- /dev/null +++ b/app/assets/javascripts/actioncable_consumer.js @@ -0,0 +1,3 @@ +import { createConsumer } from '@rails/actioncable'; + +export default createConsumer(); diff --git a/app/assets/javascripts/alert_management/components/alert_details.vue b/app/assets/javascripts/alert_management/components/alert_details.vue new file mode 100644 index 0000000000..89db7db77d --- /dev/null +++ b/app/assets/javascripts/alert_management/components/alert_details.vue @@ -0,0 +1,236 @@ + + diff --git a/app/assets/javascripts/alert_management/components/alert_management_list.vue b/app/assets/javascripts/alert_management/components/alert_management_list.vue new file mode 100644 index 0000000000..74fc19ff3d --- /dev/null +++ b/app/assets/javascripts/alert_management/components/alert_management_list.vue @@ -0,0 +1,303 @@ + + diff --git a/app/assets/javascripts/alert_management/constants.js b/app/assets/javascripts/alert_management/constants.js new file mode 100644 index 0000000000..9df01d9d0b --- /dev/null +++ b/app/assets/javascripts/alert_management/constants.js @@ -0,0 +1,46 @@ +import { s__ } from '~/locale'; + +export const ALERTS_SEVERITY_LABELS = { + CRITICAL: s__('AlertManagement|Critical'), + HIGH: s__('AlertManagement|High'), + MEDIUM: s__('AlertManagement|Medium'), + LOW: s__('AlertManagement|Low'), + INFO: s__('AlertManagement|Info'), + UNKNOWN: s__('AlertManagement|Unknown'), +}; + +export const ALERTS_STATUS = { + OPEN: 'OPEN', + TRIGGERED: 'TRIGGERED', + ACKNOWLEDGED: 'ACKNOWLEDGED', + RESOLVED: 'RESOLVED', + ALL: 'ALL', +}; + +export const ALERTS_STATUS_TABS = [ + { + title: s__('AlertManagement|Open'), + status: ALERTS_STATUS.OPEN, + filters: [ALERTS_STATUS.TRIGGERED, ALERTS_STATUS.ACKNOWLEDGED], + }, + { + title: s__('AlertManagement|Triggered'), + status: ALERTS_STATUS.TRIGGERED, + filters: [ALERTS_STATUS.TRIGGERED], + }, + { + title: s__('AlertManagement|Acknowledged'), + status: ALERTS_STATUS.ACKNOWLEDGED, + filters: [ALERTS_STATUS.ACKNOWLEDGED], + }, + { + title: s__('AlertManagement|Resolved'), + status: ALERTS_STATUS.RESOLVED, + filters: [ALERTS_STATUS.RESOLVED], + }, + { + title: s__('AlertManagement|All alerts'), + status: ALERTS_STATUS.ALL, + filters: [ALERTS_STATUS.TRIGGERED, ALERTS_STATUS.ACKNOWLEDGED, ALERTS_STATUS.RESOLVED], + }, +]; diff --git a/app/assets/javascripts/alert_management/details.js b/app/assets/javascripts/alert_management/details.js new file mode 100644 index 0000000000..d3523e0a29 --- /dev/null +++ b/app/assets/javascripts/alert_management/details.js @@ -0,0 +1,47 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import { defaultDataIdFromObject } from 'apollo-cache-inmemory'; +import AlertDetails from './components/alert_details.vue'; + +Vue.use(VueApollo); + +export default selector => { + const domEl = document.querySelector(selector); + const { alertId, projectPath, newIssuePath } = domEl.dataset; + + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient( + {}, + { + cacheConfig: { + dataIdFromObject: object => { + // eslint-disable-next-line no-underscore-dangle + if (object.__typename === 'AlertManagementAlert') { + return object.iid; + } + return defaultDataIdFromObject(object); + }, + }, + }, + ), + }); + + // eslint-disable-next-line no-new + new Vue({ + el: selector, + apolloProvider, + components: { + AlertDetails, + }, + render(createElement) { + return createElement('alert-details', { + props: { + alertId, + projectPath, + newIssuePath, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql b/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql new file mode 100644 index 0000000000..df802616e9 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/fragments/detailItem.fragment.graphql @@ -0,0 +1,11 @@ +#import "./listItem.fragment.graphql" + +fragment AlertDetailItem on AlertManagementAlert { + ...AlertListItem + createdAt + monitoringTool + service + description + updatedAt + details +} diff --git a/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql b/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql new file mode 100644 index 0000000000..fffe07b0cf --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/fragments/listItem.fragment.graphql @@ -0,0 +1,9 @@ +fragment AlertListItem on AlertManagementAlert { + iid + title + severity + status + startedAt + endedAt + eventCount +} diff --git a/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql b/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql new file mode 100644 index 0000000000..009ae0b293 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/mutations/update_alert_status.graphql @@ -0,0 +1,9 @@ +mutation ($projectPath: ID!, $status: AlertManagementStatus!, $iid: String!) { + updateAlertStatus(input: { iid: $iid, status: $status, projectPath: $projectPath }) { + errors + alert { + iid, + status, + } + } +} diff --git a/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql b/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql new file mode 100644 index 0000000000..7c77715fad --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/queries/details.query.graphql @@ -0,0 +1,11 @@ +#import "../fragments/detailItem.fragment.graphql" + +query alertDetails($fullPath: ID!, $alertId: String) { + project(fullPath: $fullPath) { + alertManagementAlerts(iid: $alertId) { + nodes { + ...AlertDetailItem + } + } + } +} diff --git a/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql b/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql new file mode 100644 index 0000000000..54b66389d5 --- /dev/null +++ b/app/assets/javascripts/alert_management/graphql/queries/getAlerts.query.graphql @@ -0,0 +1,11 @@ +#import "../fragments/listItem.fragment.graphql" + +query getAlerts($projectPath: ID!, $statuses: [AlertManagementStatus!]) { + project(fullPath: $projectPath) { + alertManagementAlerts(statuses: $statuses) { + nodes { + ...AlertListItem + } + } + } +} diff --git a/app/assets/javascripts/alert_management/list.js b/app/assets/javascripts/alert_management/list.js new file mode 100644 index 0000000000..cae6a536b5 --- /dev/null +++ b/app/assets/javascripts/alert_management/list.js @@ -0,0 +1,55 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import { defaultDataIdFromObject } from 'apollo-cache-inmemory'; +import { parseBoolean } from '~/lib/utils/common_utils'; +import AlertManagementList from './components/alert_management_list.vue'; + +Vue.use(VueApollo); + +export default () => { + const selector = '#js-alert_management'; + + const domEl = document.querySelector(selector); + const { projectPath, enableAlertManagementPath, emptyAlertSvgPath } = domEl.dataset; + let { alertManagementEnabled, userCanEnableAlertManagement } = domEl.dataset; + + alertManagementEnabled = parseBoolean(alertManagementEnabled); + userCanEnableAlertManagement = parseBoolean(userCanEnableAlertManagement); + + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient( + {}, + { + cacheConfig: { + dataIdFromObject: object => { + // eslint-disable-next-line no-underscore-dangle + if (object.__typename === 'AlertManagementAlert') { + return object.iid; + } + return defaultDataIdFromObject(object); + }, + }, + }, + ), + }); + + return new Vue({ + el: selector, + apolloProvider, + components: { + AlertManagementList, + }, + render(createElement) { + return createElement('alert-management-list', { + props: { + projectPath, + enableAlertManagementPath, + emptyAlertSvgPath, + alertManagementEnabled, + userCanEnableAlertManagement, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/alert_management/services/index.js b/app/assets/javascripts/alert_management/services/index.js new file mode 100644 index 0000000000..787603d3e7 --- /dev/null +++ b/app/assets/javascripts/alert_management/services/index.js @@ -0,0 +1,7 @@ +import axios from '~/lib/utils/axios_utils'; + +export default { + getAlertManagementList({ endpoint }) { + return axios.get(endpoint); + }, +}; diff --git a/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue b/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue index 785598142f..410c5c00e8 100644 --- a/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue +++ b/app/assets/javascripts/alerts_service_settings/components/alerts_service_form.vue @@ -6,7 +6,7 @@ import { GlModal, GlModalDirective, } from '@gitlab/ui'; -import { escape as esc } from 'lodash'; +import { escape } from 'lodash'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import ToggleButton from '~/vue_shared/components/toggle_button.vue'; import axios from '~/lib/utils/axios_utils'; @@ -65,7 +65,7 @@ export default { 'AlertService|%{linkStart}Learn more%{linkEnd} about configuring this endpoint to receive alerts.', ), { - linkStart: ``, linkEnd: '', diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index 6301f6a391..e527659a93 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -23,6 +23,8 @@ const Api = { projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions', projectRunnersPath: '/api/:version/projects/:id/runners', projectProtectedBranchesPath: '/api/:version/projects/:id/protected_branches', + projectSearchPath: '/api/:version/projects/:id/search', + projectMilestonesPath: '/api/:version/projects/:id/milestones', mergeRequestsPath: '/api/:version/merge_requests', groupLabelsPath: '/groups/:namespace_path/-/labels', issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key', @@ -46,6 +48,7 @@ const Api = { mergeRequestsPipeline: '/api/:version/projects/:id/merge_requests/:merge_request_iid/pipelines', adminStatisticsPath: '/api/:version/application/statistics', pipelineSinglePath: '/api/:version/projects/:id/pipelines/:pipeline_id', + pipelinesPath: '/api/:version/projects/:id/pipelines/', environmentsPath: '/api/:version/projects/:id/environments', rawFilePath: '/api/:version/projects/:id/repository/files/:path/raw', @@ -74,13 +77,11 @@ const Api = { const url = Api.buildUrl(Api.groupsPath); return axios .get(url, { - params: Object.assign( - { - search: query, - per_page: DEFAULT_PER_PAGE, - }, - options, - ), + params: { + search: query, + per_page: DEFAULT_PER_PAGE, + ...options, + }, }) .then(({ data }) => { callback(data); @@ -247,6 +248,23 @@ const Api = { .then(({ data }) => data); }, + projectSearch(id, options = {}) { + const url = Api.buildUrl(Api.projectSearchPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url, { + params: { + search: options.search, + scope: options.scope, + }, + }); + }, + + projectMilestones(id) { + const url = Api.buildUrl(Api.projectMilestonesPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url); + }, + mergeRequests(params = {}) { const url = Api.buildUrl(Api.mergeRequestsPath); @@ -281,7 +299,7 @@ const Api = { }; return axios .get(url, { - params: Object.assign({}, defaults, options), + params: { ...defaults, ...options }, }) .then(({ data }) => callback(data)) .catch(() => flash(__('Something went wrong while fetching projects'))); @@ -364,13 +382,11 @@ const Api = { users(query, options) { const url = Api.buildUrl(this.usersPath); return axios.get(url, { - params: Object.assign( - { - search: query, - per_page: DEFAULT_PER_PAGE, - }, - options, - ), + params: { + search: query, + per_page: DEFAULT_PER_PAGE, + ...options, + }, }); }, @@ -401,7 +417,7 @@ const Api = { }; return axios .get(url, { - params: Object.assign({}, defaults, options), + params: { ...defaults, ...options }, }) .then(({ data }) => callback(data)) .catch(() => flash(__('Something went wrong while fetching projects'))); @@ -502,6 +518,15 @@ const Api = { return axios.get(url); }, + // Return all pipelines for a project or filter by query params + pipelines(id, options = {}) { + const url = Api.buildUrl(this.pipelinesPath).replace(':id', encodeURIComponent(id)); + + return axios.get(url, { + params: options, + }); + }, + environments(id) { const url = Api.buildUrl(this.environmentsPath).replace(':id', encodeURIComponent(id)); return axios.get(url); diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js index 07d79ea1c7..5f50fcc112 100644 --- a/app/assets/javascripts/autosave.js +++ b/app/assets/javascripts/autosave.js @@ -3,7 +3,7 @@ import AccessorUtilities from './lib/utils/accessor'; export default class Autosave { - constructor(field, key, fallbackKey) { + constructor(field, key, fallbackKey, lockVersion) { this.field = field; this.isLocalStorageAvailable = AccessorUtilities.isLocalStorageAccessSafe(); @@ -12,6 +12,8 @@ export default class Autosave { } this.key = `autosave/${key}`; this.fallbackKey = fallbackKey; + this.lockVersionKey = `${this.key}/lockVersion`; + this.lockVersion = lockVersion; this.field.data('autosave', this); this.restore(); this.field.on('input', () => this.save()); @@ -40,6 +42,11 @@ export default class Autosave { } } + getSavedLockVersion() { + if (!this.isLocalStorageAvailable) return; + return window.localStorage.getItem(this.lockVersionKey); + } + save() { if (!this.field.length) return; @@ -49,6 +56,9 @@ export default class Autosave { if (this.fallbackKey) { window.localStorage.setItem(this.fallbackKey, text); } + if (this.lockVersion !== undefined) { + window.localStorage.setItem(this.lockVersionKey, this.lockVersion); + } return window.localStorage.setItem(this.key, text); } @@ -58,6 +68,7 @@ export default class Autosave { reset() { if (!this.isLocalStorageAvailable) return; + window.localStorage.removeItem(this.lockVersionKey); window.localStorage.removeItem(this.fallbackKey); return window.localStorage.removeItem(this.key); } diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index 67164997bd..8381b05090 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -1,7 +1,7 @@ /* eslint-disable class-methods-use-this, @gitlab/require-i18n-strings */ import $ from 'jquery'; -import _ from 'underscore'; +import { uniq } from 'lodash'; import { GlBreakpointInstance as bp } from '@gitlab/ui/dist/utils'; import Cookies from 'js-cookie'; import { __ } from './locale'; @@ -513,7 +513,7 @@ export class AwardsHandler { addEmojiToFrequentlyUsedList(emoji) { if (this.emoji.isEmojiNameValid(emoji)) { - this.frequentlyUsedEmojis = _.uniq(this.getFrequentlyUsedEmojis().concat(emoji)); + this.frequentlyUsedEmojis = uniq(this.getFrequentlyUsedEmojis().concat(emoji)); Cookies.set('frequently_used_emojis', this.frequentlyUsedEmojis.join(','), { expires: 365 }); } } @@ -522,9 +522,7 @@ export class AwardsHandler { return ( this.frequentlyUsedEmojis || (() => { - const frequentlyUsedEmojis = _.uniq( - (Cookies.get('frequently_used_emojis') || '').split(','), - ); + const frequentlyUsedEmojis = uniq((Cookies.get('frequently_used_emojis') || '').split(',')); this.frequentlyUsedEmojis = frequentlyUsedEmojis.filter(inputName => this.emoji.isEmojiNameValid(inputName), ); diff --git a/app/assets/javascripts/behaviors/copy_to_clipboard.js b/app/assets/javascripts/behaviors/copy_to_clipboard.js index c3541e6256..48bcba7bcc 100644 --- a/app/assets/javascripts/behaviors/copy_to_clipboard.js +++ b/app/assets/javascripts/behaviors/copy_to_clipboard.js @@ -17,10 +17,11 @@ function showTooltip(target, title) { } function genericSuccess(e) { - showTooltip(e.trigger, __('Copied')); // Clear the selection and blur the trigger so it loses its border e.clearSelection(); $(e.trigger).blur(); + + showTooltip(e.trigger, __('Copied')); } /** diff --git a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js index 7e020139fe..f846511195 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js +++ b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js @@ -1,7 +1,7 @@ /* eslint-disable class-methods-use-this */ import { Mark } from 'tiptap'; -import { escape as esc } from 'lodash'; +import { escape } from 'lodash'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter export default class InlineHTML extends Mark { @@ -35,7 +35,7 @@ export default class InlineHTML extends Mark { mixable: true, open(state, mark) { return `<${mark.attrs.tag}${ - mark.attrs.title ? ` title="${state.esc(esc(mark.attrs.title))}"` : '' + mark.attrs.title ? ` title="${state.esc(escape(mark.attrs.title))}"` : '' }>`; }, close(state, mark) { diff --git a/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js b/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js index 665a721642..278dd857ab 100644 --- a/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js +++ b/app/assets/javascripts/behaviors/markdown/paste_markdown_table.js @@ -47,7 +47,8 @@ export default class PasteMarkdownTable { const htmlData = this.data.getData('text/html'); this.doc = new DOMParser().parseFromString(htmlData, 'text/html'); - const tables = this.doc.querySelectorAll('table'); + // Avoid formatting lines that were copied from a diff + const tables = this.doc.querySelectorAll('table:not(.diff-wrap-lines)'); // We're only looking for exactly one table. If there happens to be // multiple tables, it's possible an application copied data into diff --git a/app/assets/javascripts/behaviors/markdown/render_gfm.js b/app/assets/javascripts/behaviors/markdown/render_gfm.js index 137cc7b466..01627b7206 100644 --- a/app/assets/javascripts/behaviors/markdown/render_gfm.js +++ b/app/assets/javascripts/behaviors/markdown/render_gfm.js @@ -16,7 +16,7 @@ $.fn.renderGFM = function renderGFM() { renderMath(this.find('.js-render-math')); renderMermaid(this.find('.js-render-mermaid')); highlightCurrentUser(this.find('.gfm-project_member').get()); - initUserPopovers(this.find('.gfm-project_member').get()); + initUserPopovers(this.find('.js-user-link').get()); initMRPopovers(this.find('.gfm-merge_request').get()); renderMetrics(this.find('.js-render-metrics').get()); return this; diff --git a/app/assets/javascripts/behaviors/markdown/render_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_mermaid.js index fe63ebd470..057cdb6cc4 100644 --- a/app/assets/javascripts/behaviors/markdown/render_mermaid.js +++ b/app/assets/javascripts/behaviors/markdown/render_mermaid.js @@ -24,13 +24,23 @@ let mermaidModule = {}; function importMermaidModule() { return import(/* webpackChunkName: 'mermaid' */ 'mermaid') .then(mermaid => { + let theme = 'neutral'; + + if ( + window.gon?.user_color_scheme === 'dark' && + // if on the Web IDE page + document.querySelector('.ide') + ) { + theme = 'dark'; + } + mermaid.initialize({ // mermaid core options mermaid: { startOnLoad: false, }, // mermaidAPI options - theme: 'neutral', + theme, flowchart: { useMaxWidth: true, htmlLabels: false, diff --git a/app/assets/javascripts/behaviors/markdown/render_metrics.js b/app/assets/javascripts/behaviors/markdown/render_metrics.js index 9260a89bd5..37cbce46b6 100644 --- a/app/assets/javascripts/behaviors/markdown/render_metrics.js +++ b/app/assets/javascripts/behaviors/markdown/render_metrics.js @@ -1,15 +1,12 @@ import Vue from 'vue'; -import EmbedGroup from '~/monitoring/components/embeds/embed_group.vue'; import { createStore } from '~/monitoring/stores/embed_group/'; // TODO: Handle copy-pasting - https://gitlab.com/gitlab-org/gitlab-foss/issues/64369. export default function renderMetrics(elements) { if (!elements.length) { - return; + return Promise.resolve(); } - const EmbedGroupComponent = Vue.extend(EmbedGroup); - const wrapperList = []; elements.forEach(element => { @@ -31,14 +28,20 @@ export default function renderMetrics(elements) { element.parentNode.removeChild(element); }); - wrapperList.forEach(wrapper => { - // eslint-disable-next-line no-new - new EmbedGroupComponent({ - el: wrapper, - store: createStore(), - propsData: { - urls: wrapper.urls, - }, + return import( + /* webpackChunkName: 'gfm_metrics' */ '~/monitoring/components/embeds/embed_group.vue' + ).then(({ default: EmbedGroup }) => { + const EmbedGroupComponent = Vue.extend(EmbedGroup); + + wrapperList.forEach(wrapper => { + // eslint-disable-next-line no-new + new EmbedGroupComponent({ + el: wrapper, + store: createStore(), + propsData: { + urls: wrapper.urls, + }, + }); }); }); } diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js index d5d8edd5ac..c35a073b29 100644 --- a/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js +++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts_blob.js @@ -22,7 +22,7 @@ function eventHasModifierKeys(event) { export default class ShortcutsBlob extends Shortcuts { constructor(opts) { - const options = Object.assign({}, defaults, opts); + const options = { ...defaults, ...opts }; super(options.skipResetBindings); this.options = options; diff --git a/app/assets/javascripts/blob/blob_fork_suggestion.js b/app/assets/javascripts/blob/blob_fork_suggestion.js index 476b9405a9..44dfbfcfe1 100644 --- a/app/assets/javascripts/blob/blob_fork_suggestion.js +++ b/app/assets/javascripts/blob/blob_fork_suggestion.js @@ -17,7 +17,7 @@ const defaults = { class BlobForkSuggestion { constructor(options) { - this.elementMap = Object.assign({}, defaults, options); + this.elementMap = { ...defaults, ...options }; this.onOpenButtonClick = this.onOpenButtonClick.bind(this); this.onCancelButtonClick = this.onCancelButtonClick.bind(this); } diff --git a/app/assets/javascripts/blob/components/blob_content.vue b/app/assets/javascripts/blob/components/blob_content.vue index 7d5d48cfc3..4f433bd8df 100644 --- a/app/assets/javascripts/blob/components/blob_content.vue +++ b/app/assets/javascripts/blob/components/blob_content.vue @@ -3,12 +3,19 @@ import { GlLoadingIcon } from '@gitlab/ui'; import { RichViewer, SimpleViewer } from '~/vue_shared/components/blob_viewers'; import BlobContentError from './blob_content_error.vue'; +import { BLOB_RENDER_EVENT_LOAD, BLOB_RENDER_EVENT_SHOW_SOURCE } from './constants'; + export default { components: { GlLoadingIcon, BlobContentError, }, props: { + blob: { + type: Object, + required: false, + default: () => ({}), + }, content: { type: String, default: '', @@ -37,6 +44,8 @@ export default { return this.activeViewer.renderError; }, }, + BLOB_RENDER_EVENT_LOAD, + BLOB_RENDER_EVENT_SHOW_SOURCE, };