New upstream version 13.0.0
This commit is contained in:
parent
1a1fbfab4f
commit
df79fe94f4
4947 changed files with 182810 additions and 61833 deletions
|
@ -9,6 +9,6 @@
|
|||
/scripts/
|
||||
/tmp/
|
||||
/vendor/
|
||||
jest.config.js
|
||||
jest.config.*.js
|
||||
karma.config.js
|
||||
webpack.config.js
|
||||
|
|
|
@ -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/**/*'
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -3,7 +3,6 @@ cloud-native-image:
|
|||
image: ruby:2.6-alpine
|
||||
dependencies: []
|
||||
stage: post-test
|
||||
allow_failure: true
|
||||
variables:
|
||||
GIT_DEPTH: "1"
|
||||
script:
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -15,3 +15,4 @@ pages:
|
|||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
expire_in: 31d
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 #
|
||||
##################################################
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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=$(<GITLAB_SHELL_VERSION)
|
||||
- export GITALY_VERSION=$(<GITALY_SERVER_VERSION)
|
||||
- export GITLAB_WORKHORSE_VERSION=$(<GITLAB_WORKHORSE_VERSION)
|
||||
|
@ -146,28 +109,28 @@ review-deploy:
|
|||
review-stop-failed-deployment:
|
||||
extends:
|
||||
- .review-stop-base
|
||||
- .review:rules:mr-only-auto
|
||||
- .review:rules:review-stop-failed-deployment
|
||||
stage: prepare
|
||||
script:
|
||||
- delete_failed_release
|
||||
- delete_helm2_release
|
||||
|
||||
review-stop:
|
||||
extends:
|
||||
- .review-stop-base
|
||||
- .review:rules:mr-only-manual
|
||||
stage: review
|
||||
allow_failure: true
|
||||
script:
|
||||
- delete_release
|
||||
|
||||
.review-qa-base:
|
||||
extends: .review-docker
|
||||
extends:
|
||||
- .default-retry
|
||||
- .use-docker-in-docker
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine-ruby-2.6
|
||||
stage: qa
|
||||
# This is needed so that manual jobs with needs don't block the pipeline.
|
||||
# See https://gitlab.com/gitlab-org/gitlab/-/issues/199979.
|
||||
dependencies: ["review-deploy"]
|
||||
allow_failure: true
|
||||
variables:
|
||||
QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa"
|
||||
QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
|
||||
|
@ -179,8 +142,7 @@ review-stop:
|
|||
GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
|
||||
EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
|
||||
before_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}"
|
||||
- export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
|
||||
- echo "${CI_ENVIRONMENT_URL}"
|
||||
- echo "${QA_IMAGE}"
|
||||
|
@ -196,7 +158,7 @@ review-stop:
|
|||
review-qa-smoke:
|
||||
extends:
|
||||
- .review-qa-base
|
||||
- .review:rules:mr-only-auto-if-frontend-manual-otherwise
|
||||
- .review:rules:review-qa-smoke
|
||||
script:
|
||||
- gitlab-qa Test::Instance::Smoke "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
|
||||
|
||||
|
@ -221,7 +183,6 @@ review-performance:
|
|||
# This is needed so that manual jobs with needs don't block the pipeline.
|
||||
# See https://gitlab.com/gitlab-org/gitlab/-/issues/199979.
|
||||
dependencies: ["review-deploy"]
|
||||
allow_failure: true
|
||||
before_script:
|
||||
- export CI_ENVIRONMENT_URL="$(cat environment_url.txt)"
|
||||
- echo "${CI_ENVIRONMENT_URL}"
|
||||
|
@ -237,6 +198,7 @@ review-performance:
|
|||
- sitespeed-results/
|
||||
reports:
|
||||
performance: performance.json
|
||||
expire_in: 31d
|
||||
|
||||
parallel-spec-reports:
|
||||
extends:
|
||||
|
@ -244,7 +206,6 @@ parallel-spec-reports:
|
|||
image: ruby:2.6-alpine
|
||||
stage: post-qa
|
||||
dependencies: ["review-qa-all"]
|
||||
allow_failure: true
|
||||
variables:
|
||||
NEW_PARALLEL_SPECS_REPORT: qa/report-new.html
|
||||
BASE_ARTIFACT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/qa/"
|
||||
|
@ -263,17 +224,19 @@ parallel-spec-reports:
|
|||
- qa/gitlab-qa-run-*
|
||||
reports:
|
||||
junit: qa/gitlab-qa-run-*/**/rspec-*.xml
|
||||
expire_in: 31d
|
||||
|
||||
danger-review:
|
||||
extends:
|
||||
- .default-retry
|
||||
- .default-cache
|
||||
- .yarn-cache
|
||||
- .review:rules:danger
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:danger
|
||||
stage: test
|
||||
needs: []
|
||||
script:
|
||||
- git version
|
||||
- node --version
|
||||
- yarn install --frozen-lockfile --cache-folder .yarn-cache --prefer-offline
|
||||
- source scripts/utils.sh
|
||||
- retry yarn install --frozen-lockfile
|
||||
- danger --fail-on-errors=true --verbose
|
||||
cache:
|
||||
policy: pull
|
||||
|
|
|
@ -16,6 +16,15 @@
|
|||
.if-master-refs: &if-master-refs
|
||||
if: '$CI_COMMIT_REF_NAME == "master"'
|
||||
|
||||
.if-master-push: &if-master-push
|
||||
if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "push"'
|
||||
|
||||
.if-master-schedule-2-hourly: &if-master-schedule-2-hourly
|
||||
if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "2-hourly"'
|
||||
|
||||
.if-master-schedule-nightly: &if-master-schedule-nightly
|
||||
if: '$CI_COMMIT_BRANCH == "master" && $CI_PIPELINE_SOURCE == "schedule" && $FREQUENCY == "nightly"'
|
||||
|
||||
.if-auto-deploy-branches: &if-auto-deploy-branches
|
||||
if: '$CI_COMMIT_BRANCH =~ /^\d+-\d+-auto-deploy-\d+$/'
|
||||
|
||||
|
@ -25,8 +34,11 @@
|
|||
.if-merge-request: &if-merge-request
|
||||
if: '$CI_MERGE_REQUEST_IID'
|
||||
|
||||
.if-nightly-master-schedule: &if-nightly-master-schedule
|
||||
if: '$NIGHTLY && $CI_COMMIT_REF_NAME == "master" && $CI_PIPELINE_SOURCE == "schedule"'
|
||||
.if-merge-request-title-as-if-foss: &if-merge-request-title-as-if-foss
|
||||
if: '$CI_MERGE_REQUEST_TITLE =~ /RUN AS-IF-FOSS/'
|
||||
|
||||
.if-security-merge-request: &if-security-merge-request
|
||||
if: '$CI_PROJECT_NAMESPACE == "gitlab-org/security" && $CI_MERGE_REQUEST_IID'
|
||||
|
||||
.if-dot-com-gitlab-org-schedule: &if-dot-com-gitlab-org-schedule
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_PIPELINE_SOURCE == "schedule"'
|
||||
|
@ -37,9 +49,6 @@
|
|||
.if-dot-com-gitlab-org-merge-request: &if-dot-com-gitlab-org-merge-request
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_MERGE_REQUEST_IID'
|
||||
|
||||
.if-dot-com-gitlab-org-and-security-merge-request: &if-dot-com-gitlab-org-and-security-merge-request
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_MERGE_REQUEST_IID'
|
||||
|
||||
.if-dot-com-gitlab-org-and-security-tag: &if-dot-com-gitlab-org-and-security-tag
|
||||
if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE =~ /^gitlab-org($|\/security$)/ && $CI_COMMIT_TAG'
|
||||
|
||||
|
@ -52,6 +61,10 @@
|
|||
####################
|
||||
# Changes patterns #
|
||||
####################
|
||||
.ci-patterns: &ci-patterns
|
||||
- ".gitlab-ci.yml"
|
||||
- ".gitlab/ci/**/*"
|
||||
|
||||
.yaml-patterns: &yaml-patterns
|
||||
- "**/*.yml"
|
||||
|
||||
|
@ -77,7 +90,6 @@
|
|||
- "{,ee/}fixtures/**/*"
|
||||
- "{,ee/}rubocop/**/*"
|
||||
- "{,ee/}spec/**/*"
|
||||
- "doc/README.md" # Some RSpec test rely on this file
|
||||
|
||||
.code-patterns: &code-patterns
|
||||
- "{package.json,yarn.lock}"
|
||||
|
@ -120,7 +132,6 @@
|
|||
- "{,ee/}fixtures/**/*"
|
||||
- "{,ee/}rubocop/**/*"
|
||||
- "{,ee/}spec/**/*"
|
||||
- "doc/README.md" # Some RSpec test rely on this file
|
||||
|
||||
.code-qa-patterns: &code-qa-patterns
|
||||
- "{package.json,yarn.lock}"
|
||||
|
@ -162,7 +173,6 @@
|
|||
- "{,ee/}fixtures/**/*"
|
||||
- "{,ee/}rubocop/**/*"
|
||||
- "{,ee/}spec/**/*"
|
||||
- "doc/README.md" # Some RSpec test rely on this file
|
||||
# QA changes
|
||||
- ".dockerignore"
|
||||
- "qa/**/*"
|
||||
|
@ -173,7 +183,7 @@
|
|||
.cache-repo:rules:
|
||||
rules:
|
||||
- <<: *if-cache-credentials-schedule
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
|
||||
#############
|
||||
# CNG rules #
|
||||
|
@ -182,6 +192,7 @@
|
|||
rules:
|
||||
- <<: *if-dot-com-gitlab-org-and-security-tag
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
######################
|
||||
# Dev fixtures rules #
|
||||
|
@ -208,6 +219,7 @@
|
|||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *docs-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
.docs:rules:docs-lint:
|
||||
rules:
|
||||
|
@ -226,6 +238,7 @@
|
|||
##################
|
||||
# Frontend rules #
|
||||
##################
|
||||
# This job only runs on `master` since it pushes to the cache.
|
||||
.frontend:rules:gitlab-assets-compile-pull-push-cache:
|
||||
rules:
|
||||
- <<: *if-not-canonical-namespace
|
||||
|
@ -248,13 +261,14 @@
|
|||
changes: *code-backstage-qa-patterns
|
||||
when: on_success
|
||||
|
||||
# This job only runs on `master` since it pushes to the cache.
|
||||
.frontend:rules:compile-assets-pull-push-cache-as-if-foss:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-master-refs
|
||||
- <<: *if-master-push
|
||||
changes: *code-backstage-qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-master-schedule-2-hourly
|
||||
|
||||
.frontend:rules:compile-assets-pull-cache:
|
||||
rules:
|
||||
|
@ -266,9 +280,14 @@
|
|||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-default-refs
|
||||
- <<: *if-master-push
|
||||
changes: *code-backstage-qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-master-schedule-2-hourly
|
||||
- <<: *if-security-merge-request
|
||||
changes: *code-backstage-qa-patterns
|
||||
- <<: *if-merge-request-title-as-if-foss
|
||||
- <<: *if-merge-request
|
||||
changes: *ci-patterns
|
||||
|
||||
.frontend:rules:default-frontend-jobs:
|
||||
rules:
|
||||
|
@ -276,13 +295,27 @@
|
|||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
.frontend:rules:default-frontend-jobs-no-foss:
|
||||
.frontend:rules:default-frontend-jobs-as-if-foss:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-default-refs
|
||||
- <<: *if-master-push
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-master-schedule-2-hourly
|
||||
- <<: *if-security-merge-request
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-merge-request-title-as-if-foss
|
||||
- <<: *if-merge-request
|
||||
changes: *ci-patterns
|
||||
|
||||
.frontend:rules:ee-mr-and-master-only:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-merge-request
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-master-refs
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
.frontend:rules:qa-frontend-node:
|
||||
rules:
|
||||
|
@ -293,6 +326,15 @@
|
|||
changes: *frontend-dependency-patterns
|
||||
when: on_success
|
||||
|
||||
.frontend:rules:qa-frontend-node-latest:
|
||||
rules:
|
||||
- <<: *if-master-refs
|
||||
changes: *frontend-dependency-patterns
|
||||
allow_failure: true
|
||||
- <<: *if-merge-request
|
||||
changes: *frontend-dependency-patterns
|
||||
allow_failure: true
|
||||
|
||||
################
|
||||
# Memory rules #
|
||||
################
|
||||
|
@ -322,24 +364,33 @@
|
|||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
|
||||
.qa:rules:ee-only:
|
||||
.qa:rules:as-if-foss:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-default-refs
|
||||
- <<: *if-master-push
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-master-schedule-2-hourly
|
||||
- <<: *if-security-merge-request
|
||||
changes: *code-qa-patterns
|
||||
- <<: *if-merge-request-title-as-if-foss
|
||||
- <<: *if-merge-request
|
||||
changes: *ci-patterns
|
||||
|
||||
.qa:rules:package-and-qa:
|
||||
rules:
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *ci-patterns
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *qa-patterns
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
|
||||
###############
|
||||
# Rails rules #
|
||||
|
@ -348,36 +399,11 @@
|
|||
rules:
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
.rails:rules:default-refs-code-backstage-qa:
|
||||
rules:
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-qa-patterns
|
||||
when: on_success
|
||||
|
||||
.rails:rules:master-refs-code-backstage:
|
||||
rules:
|
||||
- <<: *if-master-refs
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
- changes: [".gitlab/ci/rails.gitlab-ci.yml"]
|
||||
|
||||
.rails:rules:nightly-master-refs-code-backstage:
|
||||
rules:
|
||||
- <<: *if-nightly-master-schedule
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
- changes: [".gitlab/ci/rails.gitlab-ci.yml"]
|
||||
|
||||
.rails:rules:nightly-master-refs-code-backstage-ee-only:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-nightly-master-schedule
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
- changes: [".gitlab/ci/rails.gitlab-ci.yml"]
|
||||
|
||||
.rails:rules:ee-only:
|
||||
rules:
|
||||
|
@ -385,13 +411,33 @@
|
|||
when: never
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
.rails:rules:as-if-foss:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-master-push
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-master-schedule-2-hourly
|
||||
- <<: *if-security-merge-request
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-merge-request-title-as-if-foss
|
||||
- <<: *if-merge-request
|
||||
changes: *ci-patterns
|
||||
|
||||
.rails:rules:ee-mr-and-master-only:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-merge-request
|
||||
changes: *code-backstage-patterns
|
||||
- <<: *if-master-refs
|
||||
changes: *code-backstage-patterns
|
||||
|
||||
.rails:rules:downtime_check:
|
||||
rules:
|
||||
- <<: *if-merge-request
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
##################
|
||||
# Releases rules #
|
||||
|
@ -414,6 +460,7 @@
|
|||
# - <<: *if-master-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-patterns
|
||||
allow_failure: true
|
||||
|
||||
.reports:rules:sast:
|
||||
rules:
|
||||
|
@ -422,6 +469,7 @@
|
|||
# - <<: *if-master-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-qa-patterns
|
||||
allow_failure: true
|
||||
|
||||
.reports:rules:dependency_scanning:
|
||||
rules:
|
||||
|
@ -430,6 +478,7 @@
|
|||
# - <<: *if-master-refs # To be done in a later iteration: https://gitlab.com/gitlab-org/gitlab/issues/31160#note_278188255
|
||||
- <<: *if-default-refs
|
||||
changes: *code-backstage-qa-patterns
|
||||
allow_failure: true
|
||||
|
||||
.reports:rules:dast:
|
||||
rules:
|
||||
|
@ -437,10 +486,11 @@
|
|||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *frontend-patterns
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
.reports:schedule-dast:
|
||||
rules:
|
||||
|
@ -451,67 +501,86 @@
|
|||
################
|
||||
# Review rules #
|
||||
################
|
||||
.review:rules:mr-and-schedule-auto:
|
||||
.review:rules:build-qa-image:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
when: on_success
|
||||
|
||||
.review:rules:mr-and-schedule-auto-if-frontend-manual-otherwise:
|
||||
.review:rules:review-build-cng:
|
||||
rules:
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *ci-patterns
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *frontend-patterns
|
||||
when: on_success
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
when: on_success
|
||||
|
||||
.review:rules:mr-only-auto:
|
||||
.review:rules:mr-and-schedule-auto-if-frontend-manual-otherwise:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: on_success
|
||||
|
||||
.review:rules:mr-only-auto-if-frontend-manual-otherwise:
|
||||
rules:
|
||||
changes: *ci-patterns
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *frontend-patterns
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
allow_failure: true
|
||||
|
||||
.review:rules:review-stop-failed-deployment:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
|
||||
.review:rules:review-qa-smoke:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *ci-patterns
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *frontend-patterns
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
.review:rules:mr-only-manual:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
|
||||
.review:rules:review-cleanup:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
allow_failure: true
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
when: on_success
|
||||
|
||||
.review:rules:review-gcp-cleanup:
|
||||
rules:
|
||||
- <<: *if-dot-com-gitlab-org-merge-request
|
||||
changes: *code-qa-patterns
|
||||
when: manual
|
||||
- <<: *if-dot-com-gitlab-org-schedule
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
|
||||
.review:rules:danger:
|
||||
rules:
|
||||
- if: '$DANGER_GITLAB_API_TOKEN && $CI_MERGE_REQUEST_IID'
|
||||
when: on_success
|
||||
|
||||
###############
|
||||
# Setup rules #
|
||||
|
@ -527,10 +596,11 @@
|
|||
.setup:rules:dont-interrupt-me:
|
||||
rules:
|
||||
- <<: *if-master-or-tag
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
- <<: *if-auto-deploy-branches
|
||||
when: on_success
|
||||
allow_failure: true
|
||||
- when: manual
|
||||
allow_failure: true
|
||||
|
||||
.setup:rules:gitlab_git_test:
|
||||
rules:
|
||||
|
@ -557,9 +627,13 @@
|
|||
|
||||
.test-metadata:rules:update-tests-metadata:
|
||||
rules:
|
||||
- <<: *if-not-ee
|
||||
when: never
|
||||
- changes:
|
||||
- ".gitlab/ci/test-metadata.gitlab-ci.yml"
|
||||
- "scripts/rspec_helpers.sh"
|
||||
- <<: *if-dot-com-ee-schedule
|
||||
changes: *code-backstage-patterns
|
||||
when: on_success
|
||||
|
||||
##############
|
||||
# YAML rules #
|
||||
|
|
|
@ -7,7 +7,7 @@ cache gems:
|
|||
- .default-before_script
|
||||
- .setup:rules:cache-gems
|
||||
stage: test
|
||||
needs: ["setup-test-env pg11"]
|
||||
needs: ["setup-test-env"]
|
||||
variables:
|
||||
SETUP_DB: "false"
|
||||
script:
|
||||
|
@ -15,6 +15,7 @@ cache gems:
|
|||
artifacts:
|
||||
paths:
|
||||
- vendor/cache
|
||||
expire_in: 31d
|
||||
|
||||
.minimal-job:
|
||||
extends:
|
||||
|
@ -26,7 +27,6 @@ dont-interrupt-me:
|
|||
stage: sync
|
||||
image: alpine:edge
|
||||
interruptible: false
|
||||
allow_failure: true
|
||||
variables:
|
||||
GIT_STRATEGY: none
|
||||
script:
|
||||
|
|
|
@ -31,6 +31,19 @@ update-tests-metadata:
|
|||
- .tests-metadata-state
|
||||
- .test-metadata:rules:update-tests-metadata
|
||||
stage: post-test
|
||||
dependencies:
|
||||
- setup-test-env
|
||||
- rspec migration pg11
|
||||
- rspec unit pg11
|
||||
- rspec integration pg11
|
||||
- rspec system pg11
|
||||
- rspec-ee migration pg11
|
||||
- rspec-ee unit pg11
|
||||
- rspec-ee integration pg11
|
||||
- rspec-ee system pg11
|
||||
- rspec-ee unit pg11 geo
|
||||
- rspec-ee integration pg11 geo
|
||||
- rspec-ee system pg11 geo
|
||||
cache:
|
||||
policy: push
|
||||
script:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- The first three sections: "Problem to solve", "Intended users" and "Proposal", are strongly recommended, while the rest of the sections can be filled out during the problem validation or breakdown phase. However, keep in mind that providing complete and relevant information early helps our product team validate the problem and start working on a solution. -->
|
||||
<!-- The first four sections: "Problem to solve", "Intended users", "User experience goal", and "Proposal", are strongly recommended, while the rest of the sections can be filled out during the problem validation or breakdown phase. However, keep in mind that providing complete and relevant information early helps our product team validate the problem and start working on a solution. -->
|
||||
|
||||
### 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
|
||||
|
||||
<!-- What is the single user experience workflow this problem addresses?
|
||||
For example, "The user should be able to use the UI/API/.gitlab-ci.yml with GitLab to <perform a specific task>"
|
||||
https://about.gitlab.com/handbook/engineering/ux/ux-research-training/user-story-mapping/ -->
|
||||
|
||||
<!-- Include use cases, benefits, goals, or any other details that will help us understand the problem better. -->
|
||||
|
||||
### Proposal
|
||||
|
||||
<!-- How are we going to solve the problem? Try to include the user journey! https://about.gitlab.com/handbook/journeys/#user-journey -->
|
||||
|
||||
### Further details
|
||||
|
||||
<!-- Include use cases, benefits, goals, or any other details that will help us understand the problem better. -->
|
||||
|
||||
### Permissions and Security
|
||||
|
||||
<!-- What permissions are required to perform the described actions? Are they consistent with the existing permissions as documented for users, groups, and projects as appropriate? Is the proposed behavior consistent between the UI, API, and other access methods (e.g. email replies)?-->
|
||||
|
||||
### Documentation
|
||||
|
||||
<!-- See the Feature Change Documentation Workflow https://docs.gitlab.com/ee/development/documentation/feature-change-workflow.html
|
||||
<!-- See the Feature Change Documentation Workflow https://docs.gitlab.com/ee/development/documentation/workflow.html#for-a-product-change
|
||||
|
||||
* Add all known Documentation Requirements in this section. See https://docs.gitlab.com/ee/development/documentation/feature-change-workflow.html#documentation-requirements
|
||||
* If this feature requires changing permissions, update the permissions document. See https://docs.gitlab.com/ee/user/permissions.html -->
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
## What is the productivity problem to solve?
|
||||
## What is the GitLab engineering productivity problem to solve?
|
||||
|
||||
<!--
|
||||
Please describe the productivity problem that needs to be solved backed by charts from
|
||||
Please describe the engineering productivity problem that needs to be solved backed by charts from
|
||||
https://about.gitlab.com/handbook/engineering/quality/engineering-productivity-team/#engineering-productivity-team-metrics.
|
||||
-->
|
||||
|
||||
|
@ -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
|
||||
|
|
|
@ -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 | |
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
### Tasks to Evaluate
|
||||
|
||||
<!-- Outline the tasks with issues that you need evaluate as a part of the implementation issue -->
|
||||
<!-- Outline the tasks with issues that you need to evaluate as a part of the implementation issue -->
|
||||
|
||||
- [ ] 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
|
||||
|
||||
<!-- Idenitfy any risks found in the research, whether this is performance, impacts to other functionality or other bugs -->
|
||||
<!-- Identify any risks found in the research, whether this is performance, impacts to other functionality or other bugs -->
|
||||
|
||||
### Team
|
||||
|
||||
|
|
|
@ -13,12 +13,25 @@
|
|||
|
||||
<!-- Link related issues below. Insert the issue link or reference after the word "Closes" if merging this should automatically close it. -->
|
||||
|
||||
## 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**
|
||||
|
||||
|
|
|
@ -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`.
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
74
.rubocop.yml
74
.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/**/*'
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
608
CHANGELOG.md
608
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 <pyro4hell@gmail.com>)
|
||||
- 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)
|
||||
|
|
|
@ -1 +1 @@
|
|||
12.10.3
|
||||
13.0.0
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.2.0
|
||||
2.3.0
|
||||
|
|
|
@ -1 +1 @@
|
|||
1.17.0
|
||||
1.18.0
|
||||
|
|
|
@ -1 +1 @@
|
|||
12.2.0
|
||||
13.2.0
|
||||
|
|
|
@ -1 +1 @@
|
|||
8.30.1
|
||||
8.31.0
|
||||
|
|
45
Gemfile
45
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'
|
||||
|
|
193
Gemfile.lock
193
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)
|
||||
|
|
51
Guardfile
51
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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
12.10.3
|
||||
13.0.0
|
||||
|
|
BIN
app/assets/images/cluster_app_logos/fluentd.png
Normal file
BIN
app/assets/images/cluster_app_logos/fluentd.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,14 @@
|
|||
<script>
|
||||
import { GlDatepicker } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
name: 'ExpiresAtField',
|
||||
components: { GlDatepicker },
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<gl-datepicker :target="null" :min-date="new Date()">
|
||||
<slot></slot>
|
||||
</gl-datepicker>
|
||||
</template>
|
12
app/assets/javascripts/access_tokens/index.js
Normal file
12
app/assets/javascripts/access_tokens/index.js
Normal file
|
@ -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;
|
3
app/assets/javascripts/actioncable_consumer.js
Normal file
3
app/assets/javascripts/actioncable_consumer.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
import { createConsumer } from '@rails/actioncable';
|
||||
|
||||
export default createConsumer();
|
|
@ -0,0 +1,236 @@
|
|||
<script>
|
||||
import * as Sentry from '@sentry/browser';
|
||||
import {
|
||||
GlAlert,
|
||||
GlIcon,
|
||||
GlLoadingIcon,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlSprintf,
|
||||
GlTabs,
|
||||
GlTab,
|
||||
GlButton,
|
||||
GlTable,
|
||||
} from '@gitlab/ui';
|
||||
import createFlash from '~/flash';
|
||||
import { s__ } from '~/locale';
|
||||
import query from '../graphql/queries/details.query.graphql';
|
||||
import { fetchPolicies } from '~/lib/graphql';
|
||||
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
|
||||
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
||||
import { ALERTS_SEVERITY_LABELS } from '../constants';
|
||||
import updateAlertStatus from '../graphql/mutations/update_alert_status.graphql';
|
||||
|
||||
export default {
|
||||
statuses: {
|
||||
TRIGGERED: s__('AlertManagement|Triggered'),
|
||||
ACKNOWLEDGED: s__('AlertManagement|Acknowledged'),
|
||||
RESOLVED: s__('AlertManagement|Resolved'),
|
||||
},
|
||||
i18n: {
|
||||
errorMsg: s__(
|
||||
'AlertManagement|There was an error displaying the alert. Please refresh the page to try again.',
|
||||
),
|
||||
fullAlertDetailsTitle: s__('AlertManagement|Alert details'),
|
||||
overviewTitle: s__('AlertManagement|Overview'),
|
||||
reportedAt: s__('AlertManagement|Reported %{when}'),
|
||||
reportedAtWithTool: s__('AlertManagement|Reported %{when} by %{tool}'),
|
||||
},
|
||||
severityLabels: ALERTS_SEVERITY_LABELS,
|
||||
components: {
|
||||
GlAlert,
|
||||
GlIcon,
|
||||
GlLoadingIcon,
|
||||
GlSprintf,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlTab,
|
||||
GlTabs,
|
||||
GlButton,
|
||||
GlTable,
|
||||
TimeAgoTooltip,
|
||||
},
|
||||
mixins: [glFeatureFlagsMixin()],
|
||||
props: {
|
||||
alertId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
projectPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
newIssuePath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
apollo: {
|
||||
alert: {
|
||||
fetchPolicy: fetchPolicies.CACHE_AND_NETWORK,
|
||||
query,
|
||||
variables() {
|
||||
return {
|
||||
fullPath: this.projectPath,
|
||||
alertId: this.alertId,
|
||||
};
|
||||
},
|
||||
update(data) {
|
||||
return data?.project?.alertManagementAlerts?.nodes?.[0] ?? null;
|
||||
},
|
||||
error(error) {
|
||||
this.errored = true;
|
||||
Sentry.captureException(error);
|
||||
},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return { alert: null, errored: false, isErrorDismissed: false };
|
||||
},
|
||||
computed: {
|
||||
loading() {
|
||||
return this.$apollo.queries.alert.loading;
|
||||
},
|
||||
reportedAtMessage() {
|
||||
return this.alert?.monitoringTool
|
||||
? this.$options.i18n.reportedAtWithTool
|
||||
: this.$options.i18n.reportedAt;
|
||||
},
|
||||
showErrorMsg() {
|
||||
return this.errored && !this.isErrorDismissed;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
dismissError() {
|
||||
this.isErrorDismissed = true;
|
||||
},
|
||||
updateAlertStatus(status) {
|
||||
this.$apollo
|
||||
.mutate({
|
||||
mutation: updateAlertStatus,
|
||||
variables: {
|
||||
iid: this.alertId,
|
||||
status: status.toUpperCase(),
|
||||
projectPath: this.projectPath,
|
||||
},
|
||||
})
|
||||
.catch(() => {
|
||||
createFlash(
|
||||
s__(
|
||||
'AlertManagement|There was an error while updating the status of the alert. Please try again.',
|
||||
),
|
||||
);
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<div>
|
||||
<gl-alert v-if="showErrorMsg" variant="danger" @dismiss="dismissError">
|
||||
{{ $options.i18n.errorMsg }}
|
||||
</gl-alert>
|
||||
<div v-if="loading"><gl-loading-icon size="lg" class="gl-mt-5" /></div>
|
||||
<div v-if="alert" class="alert-management-details gl-relative">
|
||||
<div
|
||||
class="gl-display-flex gl-justify-content-space-between gl-align-items-baseline gl-px-1 py-3 py-md-4 gl-border-b-1 gl-border-b-gray-200 gl-border-b-solid flex-column flex-sm-row"
|
||||
>
|
||||
<div
|
||||
data-testid="alert-header"
|
||||
class="gl-display-flex gl-align-items-center gl-justify-content-center"
|
||||
>
|
||||
<div
|
||||
class="gl-display-inline-flex gl-align-items-center gl-justify-content-space-between"
|
||||
>
|
||||
<gl-icon
|
||||
class="gl-mr-3 align-middle"
|
||||
:size="12"
|
||||
:name="`severity-${alert.severity.toLowerCase()}`"
|
||||
:class="`icon-${alert.severity.toLowerCase()}`"
|
||||
/>
|
||||
<strong>{{ $options.severityLabels[alert.severity] }}</strong>
|
||||
</div>
|
||||
<span class="mx-2">•</span>
|
||||
<gl-sprintf :message="reportedAtMessage">
|
||||
<template #when>
|
||||
<time-ago-tooltip :time="alert.createdAt" class="gl-ml-3" />
|
||||
</template>
|
||||
<template #tool>{{ alert.monitoringTool }}</template>
|
||||
</gl-sprintf>
|
||||
</div>
|
||||
<gl-button
|
||||
v-if="glFeatures.createIssueFromAlertEnabled"
|
||||
class="gl-mt-3 mt-sm-0 align-self-center align-self-sm-baseline alert-details-create-issue-button"
|
||||
data-testid="createIssueBtn"
|
||||
:href="newIssuePath"
|
||||
category="primary"
|
||||
variant="success"
|
||||
>
|
||||
{{ s__('AlertManagement|Create issue') }}
|
||||
</gl-button>
|
||||
</div>
|
||||
<div
|
||||
v-if="alert"
|
||||
class="gl-display-flex gl-justify-content-space-between gl-align-items-center"
|
||||
>
|
||||
<h2 data-testid="title">{{ alert.title }}</h2>
|
||||
</div>
|
||||
<gl-dropdown :text="$options.statuses[alert.status]" class="gl-absolute gl-right-0" right>
|
||||
<gl-dropdown-item
|
||||
v-for="(label, field) in $options.statuses"
|
||||
:key="field"
|
||||
data-testid="statusDropdownItem"
|
||||
class="gl-vertical-align-middle"
|
||||
@click="updateAlertStatus(label)"
|
||||
>
|
||||
<span class="d-flex">
|
||||
<gl-icon
|
||||
class="flex-shrink-0 append-right-4"
|
||||
:class="{ invisible: label.toUpperCase() !== alert.status }"
|
||||
name="mobile-issue-close"
|
||||
/>
|
||||
{{ label }}
|
||||
</span>
|
||||
</gl-dropdown-item>
|
||||
</gl-dropdown>
|
||||
<gl-tabs v-if="alert" data-testid="alertDetailsTabs">
|
||||
<gl-tab data-testid="overviewTab" :title="$options.i18n.overviewTitle">
|
||||
<ul class="pl-4 mb-n1">
|
||||
<li v-if="alert.startedAt" class="my-2">
|
||||
<strong class="bold">{{ s__('AlertManagement|Start time') }}:</strong>
|
||||
<time-ago-tooltip data-testid="startTimeItem" :time="alert.startedAt" />
|
||||
</li>
|
||||
<li v-if="alert.eventCount" class="my-2">
|
||||
<strong class="bold">{{ s__('AlertManagement|Events') }}:</strong>
|
||||
<span data-testid="eventCount">{{ alert.eventCount }}</span>
|
||||
</li>
|
||||
<li v-if="alert.monitoringTool" class="my-2">
|
||||
<strong class="bold">{{ s__('AlertManagement|Tool') }}:</strong>
|
||||
<span data-testid="monitoringTool">{{ alert.monitoringTool }}</span>
|
||||
</li>
|
||||
<li v-if="alert.service" class="my-2">
|
||||
<strong class="bold">{{ s__('AlertManagement|Service') }}:</strong>
|
||||
<span data-testid="service">{{ alert.service }}</span>
|
||||
</li>
|
||||
</ul>
|
||||
</gl-tab>
|
||||
<gl-tab data-testid="fullDetailsTab" :title="$options.i18n.fullAlertDetailsTitle">
|
||||
<gl-table
|
||||
class="alert-management-details-table"
|
||||
:items="[{ key: 'Value', ...alert }]"
|
||||
:show-empty="true"
|
||||
:busy="loading"
|
||||
stacked
|
||||
>
|
||||
<template #empty>
|
||||
{{ s__('AlertManagement|No alert data to display.') }}
|
||||
</template>
|
||||
<template #table-busy>
|
||||
<gl-loading-icon size="lg" color="dark" class="mt-3" />
|
||||
</template>
|
||||
</gl-table>
|
||||
</gl-tab>
|
||||
</gl-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,303 @@
|
|||
<script>
|
||||
import {
|
||||
GlEmptyState,
|
||||
GlDeprecatedButton,
|
||||
GlLoadingIcon,
|
||||
GlTable,
|
||||
GlAlert,
|
||||
GlIcon,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlTabs,
|
||||
GlTab,
|
||||
} from '@gitlab/ui';
|
||||
import createFlash from '~/flash';
|
||||
import { s__ } from '~/locale';
|
||||
import { joinPaths, visitUrl } from '~/lib/utils/url_utility';
|
||||
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
|
||||
import getAlerts from '../graphql/queries/getAlerts.query.graphql';
|
||||
import { ALERTS_STATUS, ALERTS_STATUS_TABS, ALERTS_SEVERITY_LABELS } from '../constants';
|
||||
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
|
||||
import updateAlertStatus from '../graphql/mutations/update_alert_status.graphql';
|
||||
import { capitalizeFirstCharacter } from '~/lib/utils/text_utility';
|
||||
|
||||
const tdClass = 'table-col d-flex d-md-table-cell align-items-center';
|
||||
const bodyTrClass =
|
||||
'gl-border-1 gl-border-t-solid gl-border-gray-100 hover-bg-blue-50 hover-gl-cursor-pointer hover-gl-border-b-solid hover-gl-border-blue-200';
|
||||
|
||||
export default {
|
||||
bodyTrClass,
|
||||
i18n: {
|
||||
noAlertsMsg: s__(
|
||||
"AlertManagement|No alerts available to display. If you think you're seeing this message in error, refresh the page.",
|
||||
),
|
||||
errorMsg: s__(
|
||||
"AlertManagement|There was an error displaying the alerts. Confirm your endpoint's configuration details to ensure alerts appear.",
|
||||
),
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
key: 'severity',
|
||||
label: s__('AlertManagement|Severity'),
|
||||
tdClass: `${tdClass} rounded-top text-capitalize`,
|
||||
},
|
||||
{
|
||||
key: 'startedAt',
|
||||
label: s__('AlertManagement|Start time'),
|
||||
tdClass,
|
||||
},
|
||||
{
|
||||
key: 'endedAt',
|
||||
label: s__('AlertManagement|End time'),
|
||||
tdClass,
|
||||
},
|
||||
{
|
||||
key: 'title',
|
||||
label: s__('AlertManagement|Alert'),
|
||||
thClass: 'w-30p',
|
||||
tdClass,
|
||||
},
|
||||
{
|
||||
key: 'eventCount',
|
||||
label: s__('AlertManagement|Events'),
|
||||
thClass: 'text-right event-count',
|
||||
tdClass: `${tdClass} text-md-right event-count`,
|
||||
},
|
||||
{
|
||||
key: 'status',
|
||||
thClass: 'w-15p',
|
||||
label: s__('AlertManagement|Status'),
|
||||
tdClass: `${tdClass} rounded-bottom`,
|
||||
},
|
||||
],
|
||||
statuses: {
|
||||
[ALERTS_STATUS.TRIGGERED]: s__('AlertManagement|Triggered'),
|
||||
[ALERTS_STATUS.ACKNOWLEDGED]: s__('AlertManagement|Acknowledged'),
|
||||
[ALERTS_STATUS.RESOLVED]: s__('AlertManagement|Resolved'),
|
||||
},
|
||||
severityLabels: ALERTS_SEVERITY_LABELS,
|
||||
statusTabs: ALERTS_STATUS_TABS,
|
||||
components: {
|
||||
GlEmptyState,
|
||||
GlLoadingIcon,
|
||||
GlTable,
|
||||
GlAlert,
|
||||
GlDeprecatedButton,
|
||||
TimeAgo,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlIcon,
|
||||
GlTabs,
|
||||
GlTab,
|
||||
},
|
||||
mixins: [glFeatureFlagsMixin()],
|
||||
props: {
|
||||
projectPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
alertManagementEnabled: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
enableAlertManagementPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
userCanEnableAlertManagement: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
emptyAlertSvgPath: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
apollo: {
|
||||
alerts: {
|
||||
query: getAlerts,
|
||||
variables() {
|
||||
return {
|
||||
projectPath: this.projectPath,
|
||||
statuses: this.statusFilter,
|
||||
};
|
||||
},
|
||||
update(data) {
|
||||
return data.project.alertManagementAlerts.nodes;
|
||||
},
|
||||
error() {
|
||||
this.errored = true;
|
||||
},
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
alerts: null,
|
||||
errored: false,
|
||||
isAlertDismissed: false,
|
||||
isErrorAlertDismissed: false,
|
||||
statusFilter: this.$options.statusTabs[4].filters,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
showNoAlertsMsg() {
|
||||
return !this.errored && !this.loading && !this.alerts?.length && !this.isAlertDismissed;
|
||||
},
|
||||
showErrorMsg() {
|
||||
return this.errored && !this.isErrorAlertDismissed;
|
||||
},
|
||||
loading() {
|
||||
return this.$apollo.queries.alerts.loading;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
filterAlertsByStatus(tabIndex) {
|
||||
this.statusFilter = this.$options.statusTabs[tabIndex].filters;
|
||||
},
|
||||
capitalizeFirstCharacter,
|
||||
updateAlertStatus(status, iid) {
|
||||
this.$apollo
|
||||
.mutate({
|
||||
mutation: updateAlertStatus,
|
||||
variables: {
|
||||
iid,
|
||||
status: status.toUpperCase(),
|
||||
projectPath: this.projectPath,
|
||||
},
|
||||
})
|
||||
.then(() => {
|
||||
this.$apollo.queries.alerts.refetch();
|
||||
})
|
||||
.catch(() => {
|
||||
createFlash(
|
||||
s__(
|
||||
'AlertManagement|There was an error while updating the status of the alert. Please try again.',
|
||||
),
|
||||
);
|
||||
});
|
||||
},
|
||||
navigateToAlertDetails({ iid }) {
|
||||
return visitUrl(joinPaths(window.location.pathname, iid, 'details'));
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="alertManagementEnabled" class="alert-management-list">
|
||||
<gl-alert v-if="showNoAlertsMsg" @dismiss="isAlertDismissed = true">
|
||||
{{ $options.i18n.noAlertsMsg }}
|
||||
</gl-alert>
|
||||
<gl-alert v-if="showErrorMsg" variant="danger" @dismiss="isErrorAlertDismissed = true">
|
||||
{{ $options.i18n.errorMsg }}
|
||||
</gl-alert>
|
||||
|
||||
<gl-tabs v-if="glFeatures.alertListStatusFilteringEnabled" @input="filterAlertsByStatus">
|
||||
<gl-tab v-for="tab in $options.statusTabs" :key="tab.status">
|
||||
<template slot="title">
|
||||
<span>{{ tab.title }}</span>
|
||||
</template>
|
||||
</gl-tab>
|
||||
</gl-tabs>
|
||||
|
||||
<h4 class="d-block d-md-none my-3">
|
||||
{{ s__('AlertManagement|Alerts') }}
|
||||
</h4>
|
||||
<gl-table
|
||||
class="alert-management-table mt-3"
|
||||
:items="alerts"
|
||||
:fields="$options.fields"
|
||||
:show-empty="true"
|
||||
:busy="loading"
|
||||
stacked="md"
|
||||
:tbody-tr-class="$options.bodyTrClass"
|
||||
@row-clicked="navigateToAlertDetails"
|
||||
>
|
||||
<template #cell(severity)="{ item }">
|
||||
<div
|
||||
class="d-inline-flex align-items-center justify-content-between"
|
||||
data-testid="severityField"
|
||||
>
|
||||
<gl-icon
|
||||
class="mr-2"
|
||||
:size="12"
|
||||
:name="`severity-${item.severity.toLowerCase()}`"
|
||||
:class="`icon-${item.severity.toLowerCase()}`"
|
||||
/>
|
||||
{{ $options.severityLabels[item.severity] }}
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template #cell(startedAt)="{ item }">
|
||||
<time-ago v-if="item.startedAt" :time="item.startedAt" />
|
||||
</template>
|
||||
|
||||
<template #cell(endedAt)="{ item }">
|
||||
<time-ago v-if="item.endedAt" :time="item.endedAt" />
|
||||
</template>
|
||||
|
||||
<template #cell(title)="{ item }">
|
||||
<div class="gl-max-w-full text-truncate">{{ item.title }}</div>
|
||||
</template>
|
||||
|
||||
<template #cell(status)="{ item }">
|
||||
<gl-dropdown
|
||||
:text="capitalizeFirstCharacter(item.status.toLowerCase())"
|
||||
class="w-100"
|
||||
right
|
||||
>
|
||||
<gl-dropdown-item
|
||||
v-for="(label, field) in $options.statuses"
|
||||
:key="field"
|
||||
@click="updateAlertStatus(label, item.iid)"
|
||||
>
|
||||
<span class="d-flex">
|
||||
<gl-icon
|
||||
class="flex-shrink-0 append-right-4"
|
||||
:class="{ invisible: label.toUpperCase() !== item.status }"
|
||||
name="mobile-issue-close"
|
||||
/>
|
||||
{{ label }}
|
||||
</span>
|
||||
</gl-dropdown-item>
|
||||
</gl-dropdown>
|
||||
</template>
|
||||
|
||||
<template #empty>
|
||||
{{ s__('AlertManagement|No alerts to display.') }}
|
||||
</template>
|
||||
|
||||
<template #table-busy>
|
||||
<gl-loading-icon size="lg" color="dark" class="mt-3" />
|
||||
</template>
|
||||
</gl-table>
|
||||
</div>
|
||||
<gl-empty-state
|
||||
v-else
|
||||
:title="s__('AlertManagement|Surface alerts in GitLab')"
|
||||
:svg-path="emptyAlertSvgPath"
|
||||
>
|
||||
<template #description>
|
||||
<div class="d-block">
|
||||
<span>{{
|
||||
s__(
|
||||
'AlertManagement|Display alerts from all your monitoring tools directly within GitLab. Streamline the investigation of your alerts and the escalation of alerts to incidents.',
|
||||
)
|
||||
}}</span>
|
||||
<a href="/help/user/project/operations/alert_management.html" target="_blank">
|
||||
{{ s__('AlertManagement|More information') }}
|
||||
</a>
|
||||
</div>
|
||||
<div v-if="userCanEnableAlertManagement" class="d-block center pt-4">
|
||||
<gl-deprecated-button
|
||||
category="primary"
|
||||
variant="success"
|
||||
:href="enableAlertManagementPath"
|
||||
>
|
||||
{{ s__('AlertManagement|Authorize external service') }}
|
||||
</gl-deprecated-button>
|
||||
</div>
|
||||
</template>
|
||||
</gl-empty-state>
|
||||
</div>
|
||||
</template>
|
46
app/assets/javascripts/alert_management/constants.js
Normal file
46
app/assets/javascripts/alert_management/constants.js
Normal file
|
@ -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],
|
||||
},
|
||||
];
|
47
app/assets/javascripts/alert_management/details.js
Normal file
47
app/assets/javascripts/alert_management/details.js
Normal file
|
@ -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,
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
};
|
|
@ -0,0 +1,11 @@
|
|||
#import "./listItem.fragment.graphql"
|
||||
|
||||
fragment AlertDetailItem on AlertManagementAlert {
|
||||
...AlertListItem
|
||||
createdAt
|
||||
monitoringTool
|
||||
service
|
||||
description
|
||||
updatedAt
|
||||
details
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
fragment AlertListItem on AlertManagementAlert {
|
||||
iid
|
||||
title
|
||||
severity
|
||||
status
|
||||
startedAt
|
||||
endedAt
|
||||
eventCount
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
mutation ($projectPath: ID!, $status: AlertManagementStatus!, $iid: String!) {
|
||||
updateAlertStatus(input: { iid: $iid, status: $status, projectPath: $projectPath }) {
|
||||
errors
|
||||
alert {
|
||||
iid,
|
||||
status,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#import "../fragments/detailItem.fragment.graphql"
|
||||
|
||||
query alertDetails($fullPath: ID!, $alertId: String) {
|
||||
project(fullPath: $fullPath) {
|
||||
alertManagementAlerts(iid: $alertId) {
|
||||
nodes {
|
||||
...AlertDetailItem
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#import "../fragments/listItem.fragment.graphql"
|
||||
|
||||
query getAlerts($projectPath: ID!, $statuses: [AlertManagementStatus!]) {
|
||||
project(fullPath: $projectPath) {
|
||||
alertManagementAlerts(statuses: $statuses) {
|
||||
nodes {
|
||||
...AlertListItem
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
55
app/assets/javascripts/alert_management/list.js
Normal file
55
app/assets/javascripts/alert_management/list.js
Normal file
|
@ -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,
|
||||
},
|
||||
});
|
||||
},
|
||||
});
|
||||
};
|
|
@ -0,0 +1,7 @@
|
|||
import axios from '~/lib/utils/axios_utils';
|
||||
|
||||
export default {
|
||||
getAlertManagementList({ endpoint }) {
|
||||
return axios.get(endpoint);
|
||||
},
|
||||
};
|
|
@ -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: `<a href="${esc(
|
||||
linkStart: `<a href="${escape(
|
||||
this.learnMoreUrl,
|
||||
)}" target="_blank" rel="noopener noreferrer">`,
|
||||
linkEnd: '</a>',
|
||||
|
|
|
@ -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(
|
||||
{
|
||||
params: {
|
||||
search: query,
|
||||
per_page: DEFAULT_PER_PAGE,
|
||||
...options,
|
||||
},
|
||||
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(
|
||||
{
|
||||
params: {
|
||||
search: query,
|
||||
per_page: DEFAULT_PER_PAGE,
|
||||
...options,
|
||||
},
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
);
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,6 +28,11 @@ export default function renderMetrics(elements) {
|
|||
element.parentNode.removeChild(element);
|
||||
});
|
||||
|
||||
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({
|
||||
|
@ -41,4 +43,5 @@ export default function renderMetrics(elements) {
|
|||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
|
@ -44,7 +53,13 @@ export default {
|
|||
<gl-loading-icon v-if="loading" size="md" color="dark" class="my-4 mx-auto" />
|
||||
|
||||
<template v-else>
|
||||
<blob-content-error v-if="viewerError" :viewer-error="viewerError" />
|
||||
<blob-content-error
|
||||
v-if="viewerError"
|
||||
:viewer-error="viewerError"
|
||||
:blob="blob"
|
||||
@[$options.BLOB_RENDER_EVENT_LOAD]="$emit($options.BLOB_RENDER_EVENT_LOAD)"
|
||||
@[$options.BLOB_RENDER_EVENT_SHOW_SOURCE]="$emit($options.BLOB_RENDER_EVENT_SHOW_SOURCE)"
|
||||
/>
|
||||
<component
|
||||
:is="viewer"
|
||||
v-else
|
||||
|
|
|
@ -1,15 +1,84 @@
|
|||
<script>
|
||||
import { __ } from '~/locale';
|
||||
import { GlSprintf, GlLink } from '@gitlab/ui';
|
||||
import { BLOB_RENDER_ERRORS } from './constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlSprintf,
|
||||
GlLink,
|
||||
},
|
||||
props: {
|
||||
viewerError: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
blob: {
|
||||
type: Object,
|
||||
required: false,
|
||||
default: () => ({}),
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
notStoredExternally() {
|
||||
return this.viewerError !== BLOB_RENDER_ERRORS.REASONS.EXTERNAL.id;
|
||||
},
|
||||
renderErrorReason() {
|
||||
const defaultReasonPath = Object.keys(BLOB_RENDER_ERRORS.REASONS).find(
|
||||
reason => BLOB_RENDER_ERRORS.REASONS[reason].id === this.viewerError,
|
||||
);
|
||||
const defaultReason = BLOB_RENDER_ERRORS.REASONS[defaultReasonPath].text;
|
||||
return this.notStoredExternally
|
||||
? defaultReason
|
||||
: defaultReason[this.blob.externalStorage || 'default'];
|
||||
},
|
||||
renderErrorOptions() {
|
||||
const load = {
|
||||
...BLOB_RENDER_ERRORS.OPTIONS.LOAD,
|
||||
condition: this.shouldShowLoadBtn,
|
||||
};
|
||||
const showSource = {
|
||||
...BLOB_RENDER_ERRORS.OPTIONS.SHOW_SOURCE,
|
||||
condition: this.shouldShowSourceBtn,
|
||||
};
|
||||
const download = {
|
||||
...BLOB_RENDER_ERRORS.OPTIONS.DOWNLOAD,
|
||||
href: this.blob.rawPath,
|
||||
};
|
||||
return [load, showSource, download];
|
||||
},
|
||||
shouldShowLoadBtn() {
|
||||
return this.viewerError === BLOB_RENDER_ERRORS.REASONS.COLLAPSED.id;
|
||||
},
|
||||
shouldShowSourceBtn() {
|
||||
return this.blob.richViewer && this.blob.renderedAsText && this.notStoredExternally;
|
||||
},
|
||||
},
|
||||
errorMessage: __(
|
||||
'This content could not be displayed because %{reason}. You can %{options} instead.',
|
||||
),
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<div class="file-content code">
|
||||
<div class="text-center py-4" v-html="viewerError"></div>
|
||||
<div class="text-center py-4">
|
||||
<gl-sprintf :message="$options.errorMessage">
|
||||
<template #reason>{{ renderErrorReason }}</template>
|
||||
<template #options>
|
||||
<template v-for="option in renderErrorOptions">
|
||||
<span v-if="option.condition" :key="option.text">
|
||||
<gl-link
|
||||
:href="option.href"
|
||||
:target="option.target"
|
||||
:data-test-id="`option-${option.id}`"
|
||||
@click="option.event && $emit(option.event)"
|
||||
>{{ option.text }}</gl-link
|
||||
>
|
||||
{{ option.conjunction }}
|
||||
</span>
|
||||
</template>
|
||||
</template>
|
||||
</gl-sprintf>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -5,6 +5,7 @@ export default {
|
|||
components: {
|
||||
GlFormInput,
|
||||
},
|
||||
inheritAttrs: false,
|
||||
props: {
|
||||
value: {
|
||||
type: String,
|
||||
|
@ -27,8 +28,9 @@ export default {
|
|||
s__('Snippets|Give your file a name to add code highlighting, e.g. example.rb for Ruby')
|
||||
"
|
||||
name="snippet_file_name"
|
||||
class="form-control js-snippet-file-name qa-snippet-file-name"
|
||||
class="form-control js-snippet-file-name"
|
||||
type="text"
|
||||
v-bind="$attrs"
|
||||
@change="$emit('input', name)"
|
||||
/>
|
||||
</div>
|
||||
|
|
|
@ -66,7 +66,7 @@ export default {
|
|||
</template>
|
||||
</blob-filepath>
|
||||
|
||||
<div class="file-actions d-none d-sm-block">
|
||||
<div class="file-actions d-none d-sm-flex">
|
||||
<viewer-switcher v-if="showViewerSwitcher" v-model="viewer" />
|
||||
|
||||
<slot name="actions"></slot>
|
||||
|
|
|
@ -28,12 +28,14 @@ export default {
|
|||
<div class="file-header-content d-flex align-items-center lh-100">
|
||||
<slot name="filepathPrepend"></slot>
|
||||
|
||||
<template v-if="blob.path">
|
||||
<file-icon :file-name="blob.path" :size="18" aria-hidden="true" css-classes="mr-2" />
|
||||
<strong
|
||||
v-if="blob.name"
|
||||
class="file-title-name qa-file-title-name mr-1 js-blob-header-filepath"
|
||||
>{{ blob.name }}</strong
|
||||
class="file-title-name mr-1 js-blob-header-filepath"
|
||||
data-qa-selector="file_title_name"
|
||||
>{{ blob.path }}</strong
|
||||
>
|
||||
</template>
|
||||
|
||||
<small class="mr-2">{{ blobSize }}</small>
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<gl-button-group class="js-blob-viewer-switcher ml-2">
|
||||
<gl-button-group class="js-blob-viewer-switcher mx-2">
|
||||
<gl-deprecated-button
|
||||
v-gl-tooltip.hover
|
||||
:aria-label="$options.SIMPLE_BLOB_VIEWER_TITLE"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { __ } from '~/locale';
|
||||
import { __, sprintf } from '~/locale';
|
||||
import { numberToHumanSize } from '~/lib/utils/number_utils';
|
||||
|
||||
export const BTN_COPY_CONTENTS_TITLE = __('Copy file contents');
|
||||
export const BTN_RAW_TITLE = __('Open raw');
|
||||
|
@ -9,3 +10,56 @@ export const SIMPLE_BLOB_VIEWER_TITLE = __('Display source');
|
|||
|
||||
export const RICH_BLOB_VIEWER = 'rich';
|
||||
export const RICH_BLOB_VIEWER_TITLE = __('Display rendered file');
|
||||
|
||||
export const BLOB_RENDER_EVENT_LOAD = 'force-content-fetch';
|
||||
export const BLOB_RENDER_EVENT_SHOW_SOURCE = 'force-switch-viewer';
|
||||
|
||||
export const BLOB_RENDER_ERRORS = {
|
||||
REASONS: {
|
||||
COLLAPSED: {
|
||||
id: 'collapsed',
|
||||
text: sprintf(__('it is larger than %{limit}'), {
|
||||
limit: numberToHumanSize(1048576), // 1MB in bytes
|
||||
}),
|
||||
},
|
||||
TOO_LARGE: {
|
||||
id: 'too_large',
|
||||
text: sprintf(__('it is larger than %{limit}'), {
|
||||
limit: numberToHumanSize(104857600), // 100MB in bytes
|
||||
}),
|
||||
},
|
||||
EXTERNAL: {
|
||||
id: 'server_side_but_stored_externally',
|
||||
text: {
|
||||
lfs: __('it is stored in LFS'),
|
||||
build_artifact: __('it is stored as a job artifact'),
|
||||
default: __('it is stored externally'),
|
||||
},
|
||||
},
|
||||
},
|
||||
OPTIONS: {
|
||||
LOAD: {
|
||||
id: 'load',
|
||||
text: __('load it anyway'),
|
||||
conjunction: __('or'),
|
||||
href: '#',
|
||||
target: '',
|
||||
event: BLOB_RENDER_EVENT_LOAD,
|
||||
},
|
||||
SHOW_SOURCE: {
|
||||
id: 'show_source',
|
||||
text: __('view the source'),
|
||||
conjunction: __('or'),
|
||||
href: '#',
|
||||
target: '',
|
||||
event: BLOB_RENDER_EVENT_SHOW_SOURCE,
|
||||
},
|
||||
DOWNLOAD: {
|
||||
id: 'download',
|
||||
text: __('download it'),
|
||||
conjunction: '',
|
||||
target: '_blank',
|
||||
condition: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
|
|
@ -72,9 +72,6 @@ export default {
|
|||
dismissCookieName() {
|
||||
return `${this.trackLabel}_${this.dismissKey}`;
|
||||
},
|
||||
commitCookieName() {
|
||||
return `suggest_gitlab_ci_yml_commit_${this.dismissKey}`;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
if (
|
||||
|
|
|
@ -1,22 +1,15 @@
|
|||
/* global ace */
|
||||
import Editor from '~/editor/editor_lite';
|
||||
|
||||
export function initEditorLite({ el, blobPath, blobContent }) {
|
||||
if (!el) {
|
||||
throw new Error(`"el" parameter is required to initialize Editor`);
|
||||
}
|
||||
let editor;
|
||||
|
||||
if (window?.gon?.features?.monacoSnippets) {
|
||||
editor = new Editor();
|
||||
const editor = new Editor();
|
||||
editor.createInstance({
|
||||
el,
|
||||
blobPath,
|
||||
blobContent,
|
||||
});
|
||||
} else {
|
||||
editor = ace.edit(el);
|
||||
}
|
||||
|
||||
return editor;
|
||||
}
|
||||
|
|
|
@ -113,9 +113,6 @@ export default Vue.extend({
|
|||
// eslint-disable-next-line @gitlab/require-i18n-strings
|
||||
return `boards.${this.boardId}.${this.list.type}.${this.list.id}`;
|
||||
},
|
||||
helpLink() {
|
||||
return boardsStore.scopedLabels.helpLink;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
filter: {
|
||||
|
|
|
@ -113,9 +113,6 @@ export default {
|
|||
// eslint-disable-next-line @gitlab/require-i18n-strings
|
||||
return `boards.${this.boardId}.${this.list.type}.${this.list.id}`;
|
||||
},
|
||||
helpLink() {
|
||||
return boardsStore.scopedLabels.helpLink;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
filter: {
|
||||
|
@ -286,7 +283,6 @@ export default {
|
|||
:background-color="list.label.color"
|
||||
:description="list.label.description"
|
||||
:scoped="showScopedLabels(list.label)"
|
||||
:scoped-labels-documentation-link="helpLink"
|
||||
:size="!list.isExpanded ? 'sm' : ''"
|
||||
:title="list.label.title"
|
||||
tooltip-placement="bottom"
|
||||
|
@ -353,7 +349,7 @@ export default {
|
|||
v-if="isSettingsShown"
|
||||
ref="settingsBtn"
|
||||
:aria-label="__(`List settings`)"
|
||||
class="no-drag rounded-right"
|
||||
class="no-drag rounded-right js-board-settings-button"
|
||||
title="List settings"
|
||||
type="button"
|
||||
@click="openSidebarSettings"
|
||||
|
|
|
@ -58,11 +58,6 @@ export default {
|
|||
required: false,
|
||||
default: false,
|
||||
},
|
||||
scopedLabelsDocumentationLink: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '#',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -182,7 +177,7 @@ export default {
|
|||
@cancel="cancel"
|
||||
@submit="submit"
|
||||
>
|
||||
<template slot="body">
|
||||
<template #body>
|
||||
<p v-if="isDeleteForm">{{ __('Are you sure you want to delete this board?') }}</p>
|
||||
<form v-else class="js-board-config-modal" @submit.prevent>
|
||||
<div v-if="!readonly" class="append-bottom-20">
|
||||
|
@ -208,7 +203,6 @@ export default {
|
|||
:can-admin-board="canAdminBoard"
|
||||
:milestone-path="milestonePath"
|
||||
:labels-path="labelsPath"
|
||||
:scoped-labels-documentation-link="scopedLabelsDocumentationLink"
|
||||
:enable-scoped-labels="enableScopedLabels"
|
||||
:project-id="projectId"
|
||||
:group-id="groupId"
|
||||
|
|
|
@ -51,7 +51,7 @@ export default Vue.extend({
|
|||
return Object.keys(this.issue).length;
|
||||
},
|
||||
milestoneTitle() {
|
||||
return this.issue.milestone ? this.issue.milestone.title : __('No Milestone');
|
||||
return this.issue.milestone ? this.issue.milestone.title : __('No milestone');
|
||||
},
|
||||
canRemove() {
|
||||
return !this.list.preset;
|
||||
|
@ -70,9 +70,6 @@ export default Vue.extend({
|
|||
selectedLabels() {
|
||||
return this.hasLabels ? this.issue.labels.map(l => l.title).join(',') : '';
|
||||
},
|
||||
helpLink() {
|
||||
return boardsStore.scopedLabels.helpLink;
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
detail: {
|
||||
|
|
|
@ -86,11 +86,6 @@ export default {
|
|||
required: false,
|
||||
default: false,
|
||||
},
|
||||
scopedLabelsDocumentationLink: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '#',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -348,7 +343,6 @@ export default {
|
|||
:scoped-issue-board-feature-enabled="scopedIssueBoardFeatureEnabled"
|
||||
:weights="weights"
|
||||
:enable-scoped-labels="enabledScopedLabels"
|
||||
:scoped-labels-documentation-link="scopedLabelsDocumentationLink"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
@ -102,9 +102,6 @@ export default {
|
|||
orderedLabels() {
|
||||
return sortBy(this.issue.labels.filter(this.isNonListLabel), 'title');
|
||||
},
|
||||
helpLink() {
|
||||
return boardsStore.scopedLabels.helpLink;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
isIndexLessThanlimit(index) {
|
||||
|
@ -181,7 +178,6 @@ export default {
|
|||
:description="label.description"
|
||||
size="sm"
|
||||
:scoped="showScopedLabel(label)"
|
||||
:scoped-labels-documentation-link="helpLink"
|
||||
@click="filterByLabel(label)"
|
||||
/>
|
||||
</template>
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
export const BoardType = {
|
||||
project: 'project',
|
||||
group: 'group',
|
||||
};
|
||||
|
||||
export const ListType = {
|
||||
assignee: 'assignee',
|
||||
milestone: 'milestone',
|
||||
|
@ -8,6 +13,9 @@ export const ListType = {
|
|||
blank: 'blank',
|
||||
};
|
||||
|
||||
export const inactiveListId = 0;
|
||||
|
||||
export default {
|
||||
BoardType,
|
||||
ListType,
|
||||
};
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import IssuableFilteredSearchTokenKeys from 'ee_else_ce/filtered_search/issuable_filtered_search_token_keys';
|
||||
import FilteredSearchContainer from '../filtered_search/container';
|
||||
import FilteredSearchManager from '../filtered_search/filtered_search_manager';
|
||||
import FilteredSearchManager from 'ee_else_ce/filtered_search/filtered_search_manager';
|
||||
import boardsStore from './stores/boards_store';
|
||||
|
||||
export default class FilteredSearchBoards extends FilteredSearchManager {
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg width="17" height="17" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg"><path d="M.147 15.496l2.146-2.146-1.286-1.286a.55.55 0 0 1-.125-.616c.101-.238.277-.357.527-.357h4a.55.55 0 0 1 .402.17.55.55 0 0 1 .17.401v4c0 .25-.12.426-.358.527-.232.101-.437.06-.616-.125l-1.286-1.286-2.146 2.146-1.428-1.428zM14.996.646l1.428 1.43-2.146 2.145 1.286 1.286c.185.179.226.384.125.616-.101.238-.277.357-.527.357h-4a.55.55 0 0 1-.402-.17.55.55 0 0 1-.17-.401v-4c0-.25.12-.426.358-.527a.553.553 0 0 1 .616.125l1.286 1.286L14.996.647zm-13.42 0L3.72 2.794l1.286-1.286a.55.55 0 0 1 .616-.125c.238.101.357.277.357.527v4a.55.55 0 0 1-.17.402.55.55 0 0 1-.401.17h-4c-.25 0-.426-.12-.527-.358-.101-.232-.06-.437.125-.616l1.286-1.286L.147 2.075 1.575.647zm14.848 14.85l-1.428 1.428-2.146-2.146-1.286 1.286c-.179.185-.384.226-.616.125-.238-.101-.357-.277-.357-.527v-4a.55.55 0 0 1 .17-.402.55.55 0 0 1 .401-.17h4c.25 0 .426.12.527.358a.553.553 0 0 1-.125.616l-1.286 1.286 2.146 2.146z" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 1,002 B |
|
@ -0,0 +1 @@
|
|||
<svg width="15" height="15" viewBox="0 0 15 15" xmlns="http://www.w3.org/2000/svg"><path d="M8.591 5.056l2.147-2.146-1.286-1.286a.55.55 0 0 1-.125-.616c.101-.238.277-.357.527-.357h4a.55.55 0 0 1 .402.17.55.55 0 0 1 .17.401v4c0 .25-.12.426-.358.527-.232.101-.437.06-.616-.125l-1.286-1.286-2.146 2.147-1.429-1.43zM5.018 8.553l1.429 1.43L4.3 12.127l1.286 1.286c.185.179.226.384.125.616-.101.238-.277.357-.527.357h-4a.55.55 0 0 1-.402-.17.55.55 0 0 1-.17-.401v-4c0-.25.12-.426.358-.527a.553.553 0 0 1 .616.125L2.872 10.7l2.146-2.147zm4.964 0l2.146 2.147 1.286-1.286a.55.55 0 0 1 .616-.125c.238.101.357.277.357.527v4a.55.55 0 0 1-.17.402.55.55 0 0 1-.401.17h-4c-.25 0-.426-.12-.527-.358-.101-.232-.06-.437.125-.616l1.286-1.286-2.147-2.146 1.43-1.429zM6.447 5.018l-1.43 1.429L2.873 4.3 1.586 5.586c-.179.185-.384.226-.616.125-.238-.101-.357-.277-.357-.527v-4a.55.55 0 0 1 .17-.402.55.55 0 0 1 .401-.17h4c.25 0 .426.12.527.358a.553.553 0 0 1-.125.616L4.3 2.872l2.147 2.146z" fill-rule="evenodd"/></svg>
|
After Width: | Height: | Size: 996 B |
|
@ -6,7 +6,6 @@ import 'ee_else_ce/boards/models/list';
|
|||
import BoardSidebar from 'ee_else_ce/boards/components/board_sidebar';
|
||||
import initNewListDropdown from 'ee_else_ce/boards/components/new_list_dropdown';
|
||||
import boardConfigToggle from 'ee_else_ce/boards/config_toggle';
|
||||
import toggleFocusMode from 'ee_else_ce/boards/toggle_focus';
|
||||
import toggleLabels from 'ee_else_ce/boards/toggle_labels';
|
||||
import {
|
||||
setPromotionState,
|
||||
|
@ -16,11 +15,15 @@ import {
|
|||
getBoardsModalData,
|
||||
} from 'ee_else_ce/boards/ee_functions';
|
||||
|
||||
import VueApollo from 'vue-apollo';
|
||||
import createDefaultClient from '~/lib/graphql';
|
||||
import Flash from '~/flash';
|
||||
import { __ } from '~/locale';
|
||||
import './models/label';
|
||||
import './models/assignee';
|
||||
import { BoardType } from './constants';
|
||||
|
||||
import toggleFocusMode from '~/boards/toggle_focus';
|
||||
import FilteredSearchBoards from '~/boards/filtered_search_boards';
|
||||
import eventHub from '~/boards/eventhub';
|
||||
import sidebarEventHub from '~/sidebar/event_hub';
|
||||
|
@ -37,7 +40,16 @@ import {
|
|||
convertObjectPropsToCamelCase,
|
||||
parseBoolean,
|
||||
} from '~/lib/utils/common_utils';
|
||||
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
|
||||
import mountMultipleBoardsSwitcher from './mount_multiple_boards_switcher';
|
||||
import projectBoardQuery from './queries/project_board.query.graphql';
|
||||
import groupQuery from './queries/group_board.query.graphql';
|
||||
|
||||
Vue.use(VueApollo);
|
||||
|
||||
const apolloProvider = new VueApollo({
|
||||
defaultClient: createDefaultClient(),
|
||||
});
|
||||
|
||||
let issueBoardsApp;
|
||||
|
||||
|
@ -79,9 +91,11 @@ export default () => {
|
|||
import('ee_component/boards/components/board_settings_sidebar.vue'),
|
||||
},
|
||||
store,
|
||||
data: {
|
||||
apolloProvider,
|
||||
data() {
|
||||
return {
|
||||
state: boardsStore.state,
|
||||
loading: true,
|
||||
loading: 0,
|
||||
boardsEndpoint: $boardApp.dataset.boardsEndpoint,
|
||||
recentBoardsEndpoint: $boardApp.dataset.recentBoardsEndpoint,
|
||||
listsEndpoint: $boardApp.dataset.listsEndpoint,
|
||||
|
@ -91,6 +105,8 @@ export default () => {
|
|||
rootPath: $boardApp.dataset.rootPath,
|
||||
bulkUpdatePath: $boardApp.dataset.bulkUpdatePath,
|
||||
detailIssue: boardsStore.detail,
|
||||
parent: $boardApp.dataset.parent,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
detailIssueVisible() {
|
||||
|
@ -124,24 +140,48 @@ export default () => {
|
|||
this.filterManager.setup();
|
||||
|
||||
boardsStore.disabled = this.disabled;
|
||||
|
||||
if (gon.features.graphqlBoardLists) {
|
||||
this.$apollo.addSmartQuery('lists', {
|
||||
query() {
|
||||
return this.parent === BoardType.group ? groupQuery : projectBoardQuery;
|
||||
},
|
||||
variables() {
|
||||
return {
|
||||
fullPath: this.state.endpoints.fullPath,
|
||||
boardId: `gid://gitlab/Board/${this.boardId}`,
|
||||
};
|
||||
},
|
||||
update(data) {
|
||||
return this.getNodes(data);
|
||||
},
|
||||
result({ data, error }) {
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
const lists = this.getNodes(data);
|
||||
|
||||
lists.forEach(list =>
|
||||
boardsStore.addList({
|
||||
...list,
|
||||
id: getIdFromGraphQLId(list.id),
|
||||
}),
|
||||
);
|
||||
|
||||
boardsStore.addBlankState();
|
||||
setPromotionState(boardsStore);
|
||||
},
|
||||
error() {
|
||||
Flash(__('An error occurred while fetching the board lists. Please try again.'));
|
||||
},
|
||||
});
|
||||
} else {
|
||||
boardsStore
|
||||
.all()
|
||||
.then(res => res.data)
|
||||
.then(lists => {
|
||||
lists.forEach(listObj => {
|
||||
let { position } = listObj;
|
||||
if (listObj.list_type === 'closed') {
|
||||
position = Infinity;
|
||||
} else if (listObj.list_type === 'backlog') {
|
||||
position = -1;
|
||||
}
|
||||
|
||||
boardsStore.addList({
|
||||
...listObj,
|
||||
position,
|
||||
});
|
||||
});
|
||||
|
||||
lists.forEach(list => boardsStore.addList(list));
|
||||
boardsStore.addBlankState();
|
||||
setPromotionState(boardsStore);
|
||||
this.loading = false;
|
||||
|
@ -149,6 +189,7 @@ export default () => {
|
|||
.catch(() => {
|
||||
Flash(__('An error occurred while fetching the board lists. Please try again.'));
|
||||
});
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
updateTokens() {
|
||||
|
@ -233,6 +274,9 @@ export default () => {
|
|||
});
|
||||
}
|
||||
},
|
||||
getNodes(data) {
|
||||
return data[this.parent]?.board?.lists.nodes;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -261,7 +305,7 @@ export default () => {
|
|||
return {
|
||||
modal: ModalStore.store,
|
||||
store: boardsStore.state,
|
||||
...getBoardsModalData($boardApp),
|
||||
...getBoardsModalData(),
|
||||
canAdminList: this.$options.el.hasAttribute('data-can-admin-list'),
|
||||
};
|
||||
},
|
||||
|
@ -325,7 +369,7 @@ export default () => {
|
|||
});
|
||||
}
|
||||
|
||||
toggleFocusMode(ModalStore, boardsStore, $boardApp);
|
||||
toggleFocusMode(ModalStore, boardsStore);
|
||||
toggleLabels();
|
||||
mountMultipleBoardsSwitcher();
|
||||
};
|
||||
|
|
|
@ -19,14 +19,15 @@ export function getBoardSortableDefaultOptions(obj) {
|
|||
const touchEnabled =
|
||||
'ontouchstart' in window || (window.DocumentTouch && document instanceof DocumentTouch);
|
||||
|
||||
const defaultSortOptions = Object.assign({}, sortableConfig, {
|
||||
const defaultSortOptions = {
|
||||
...sortableConfig,
|
||||
filter: '.no-drag',
|
||||
delay: touchEnabled ? 100 : 0,
|
||||
scrollSensitivity: touchEnabled ? 60 : 100,
|
||||
scrollSpeed: 20,
|
||||
onStart: sortableStart,
|
||||
onEnd: sortableEnd,
|
||||
});
|
||||
};
|
||||
|
||||
Object.keys(obj).forEach(key => {
|
||||
defaultSortOptions[key] = obj[key];
|
||||
|
|
|
@ -3,7 +3,7 @@ export default class ListAssignee {
|
|||
this.id = obj.id;
|
||||
this.name = obj.name;
|
||||
this.username = obj.username;
|
||||
this.avatar = obj.avatar_url || obj.avatar || gon.default_avatar_url;
|
||||
this.avatar = obj.avatarUrl || obj.avatar_url || obj.avatar || gon.default_avatar_url;
|
||||
this.path = obj.path;
|
||||
this.state = obj.state;
|
||||
this.webUrl = obj.web_url || obj.webUrl;
|
||||
|
|
|
@ -15,7 +15,7 @@ class ListIssue {
|
|||
this.labels = [];
|
||||
this.assignees = [];
|
||||
this.selected = false;
|
||||
this.position = obj.relative_position || Infinity;
|
||||
this.position = obj.position || obj.relative_position || Infinity;
|
||||
this.isFetching = {
|
||||
subscriptions: true,
|
||||
};
|
||||
|
@ -99,31 +99,7 @@ class ListIssue {
|
|||
}
|
||||
|
||||
update() {
|
||||
const data = {
|
||||
issue: {
|
||||
milestone_id: this.milestone ? this.milestone.id : null,
|
||||
due_date: this.dueDate,
|
||||
assignee_ids: this.assignees.length > 0 ? this.assignees.map(u => u.id) : [0],
|
||||
label_ids: this.labels.map(label => label.id),
|
||||
},
|
||||
};
|
||||
|
||||
if (!data.issue.label_ids.length) {
|
||||
data.issue.label_ids = [''];
|
||||
}
|
||||
|
||||
const projectPath = this.project ? this.project.path : '';
|
||||
return axios.patch(`${this.path}.json`, data).then(({ data: body = {} } = {}) => {
|
||||
/**
|
||||
* Since post implementation of Scoped labels, server can reject
|
||||
* same key-ed labels. To keep the UI and server Model consistent,
|
||||
* we're just assigning labels that server echo's back to us when we
|
||||
* PATCH the said object.
|
||||
*/
|
||||
if (body) {
|
||||
this.labels = convertObjectPropsToCamelCase(body.labels, { deep: true });
|
||||
}
|
||||
});
|
||||
return boardsStore.updateIssue(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
/* eslint-disable no-underscore-dangle, class-methods-use-this, consistent-return, no-shadow */
|
||||
/* eslint-disable no-underscore-dangle, class-methods-use-this, consistent-return */
|
||||
|
||||
import ListIssue from 'ee_else_ce/boards/models/issue';
|
||||
import { __ } from '~/locale';
|
||||
import ListLabel from './label';
|
||||
import ListAssignee from './assignee';
|
||||
import { urlParamsToObject } from '~/lib/utils/common_utils';
|
||||
import flash from '~/flash';
|
||||
import boardsStore from '../stores/boards_store';
|
||||
import ListMilestone from './milestone';
|
||||
|
@ -40,8 +39,8 @@ class List {
|
|||
this.id = obj.id;
|
||||
this._uid = this.guid();
|
||||
this.position = obj.position;
|
||||
this.title = obj.list_type === 'backlog' ? __('Open') : obj.title;
|
||||
this.type = obj.list_type;
|
||||
this.title = (obj.list_type || obj.listType) === 'backlog' ? __('Open') : obj.title;
|
||||
this.type = obj.list_type || obj.listType;
|
||||
|
||||
const typeInfo = this.getTypeInfo(this.type);
|
||||
this.preset = Boolean(typeInfo.isPreset);
|
||||
|
@ -52,14 +51,12 @@ class List {
|
|||
this.loadingMore = false;
|
||||
this.issues = obj.issues || [];
|
||||
this.issuesSize = obj.issuesSize ? obj.issuesSize : 0;
|
||||
this.maxIssueCount = Object.hasOwnProperty.call(obj, 'max_issue_count')
|
||||
? obj.max_issue_count
|
||||
: 0;
|
||||
this.maxIssueCount = obj.maxIssueCount || obj.max_issue_count || 0;
|
||||
|
||||
if (obj.label) {
|
||||
this.label = new ListLabel(obj.label);
|
||||
} else if (obj.user) {
|
||||
this.assignee = new ListAssignee(obj.user);
|
||||
} else if (obj.user || obj.assignee) {
|
||||
this.assignee = new ListAssignee(obj.user || obj.assignee);
|
||||
this.title = this.assignee.name;
|
||||
} else if (IS_EE && obj.milestone) {
|
||||
this.milestone = new ListMilestone(obj.milestone);
|
||||
|
@ -113,34 +110,7 @@ class List {
|
|||
}
|
||||
|
||||
getIssues(emptyIssues = true) {
|
||||
const data = {
|
||||
...urlParamsToObject(boardsStore.filter.path),
|
||||
page: this.page,
|
||||
};
|
||||
|
||||
if (this.label && data.label_name) {
|
||||
data.label_name = data.label_name.filter(label => label !== this.label.title);
|
||||
}
|
||||
|
||||
if (emptyIssues) {
|
||||
this.loading = true;
|
||||
}
|
||||
|
||||
return boardsStore
|
||||
.getIssuesForList(this.id, data)
|
||||
.then(res => res.data)
|
||||
.then(data => {
|
||||
this.loading = false;
|
||||
this.issuesSize = data.size;
|
||||
|
||||
if (emptyIssues) {
|
||||
this.issues = [];
|
||||
}
|
||||
|
||||
this.createIssues(data.issues);
|
||||
|
||||
return data;
|
||||
});
|
||||
return boardsStore.getListIssues(this, emptyIssues);
|
||||
}
|
||||
|
||||
newIssue(issue) {
|
||||
|
@ -164,48 +134,7 @@ class List {
|
|||
}
|
||||
|
||||
addIssue(issue, listFrom, newIndex) {
|
||||
let moveBeforeId = null;
|
||||
let moveAfterId = null;
|
||||
|
||||
if (!this.findIssue(issue.id)) {
|
||||
if (newIndex !== undefined) {
|
||||
this.issues.splice(newIndex, 0, issue);
|
||||
|
||||
if (this.issues[newIndex - 1]) {
|
||||
moveBeforeId = this.issues[newIndex - 1].id;
|
||||
}
|
||||
|
||||
if (this.issues[newIndex + 1]) {
|
||||
moveAfterId = this.issues[newIndex + 1].id;
|
||||
}
|
||||
} else {
|
||||
this.issues.push(issue);
|
||||
}
|
||||
|
||||
if (this.label) {
|
||||
issue.addLabel(this.label);
|
||||
}
|
||||
|
||||
if (this.assignee) {
|
||||
if (listFrom && listFrom.type === 'assignee') {
|
||||
issue.removeAssignee(listFrom.assignee);
|
||||
}
|
||||
issue.addAssignee(this.assignee);
|
||||
}
|
||||
|
||||
if (IS_EE && this.milestone) {
|
||||
if (listFrom && listFrom.type === 'milestone') {
|
||||
issue.removeMilestone(listFrom.milestone);
|
||||
}
|
||||
issue.addMilestone(this.milestone);
|
||||
}
|
||||
|
||||
if (listFrom) {
|
||||
this.issuesSize += 1;
|
||||
|
||||
this.updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId);
|
||||
}
|
||||
}
|
||||
boardsStore.addListIssue(this, issue, listFrom, newIndex);
|
||||
}
|
||||
|
||||
moveIssue(issue, oldIndex, newIndex, moveBeforeId, moveAfterId) {
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
#import "./board_list_shared.fragment.graphql"
|
||||
|
||||
fragment BoardListFragment on BoardList {
|
||||
...BoardListShared
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
fragment BoardListShared on BoardList {
|
||||
id,
|
||||
title,
|
||||
position,
|
||||
listType,
|
||||
collapsed,
|
||||
label {
|
||||
id,
|
||||
title,
|
||||
color,
|
||||
textColor,
|
||||
description,
|
||||
descriptionHtml
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#import "ee_else_ce/boards/queries/board_list.fragment.graphql"
|
||||
|
||||
query GroupBoard($fullPath: ID!, $boardId: ID!) {
|
||||
group(fullPath: $fullPath) {
|
||||
board(id: $boardId) {
|
||||
lists {
|
||||
nodes {
|
||||
...BoardListFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
#import "ee_else_ce/boards/queries/board_list.fragment.graphql"
|
||||
|
||||
query ProjectBoard($fullPath: ID!, $boardId: ID!) {
|
||||
project(fullPath: $fullPath) {
|
||||
board(id: $boardId) {
|
||||
lists {
|
||||
nodes {
|
||||
...BoardListFragment
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,7 +6,12 @@ import { sortBy } from 'lodash';
|
|||
import Vue from 'vue';
|
||||
import Cookies from 'js-cookie';
|
||||
import BoardsStoreEE from 'ee_else_ce/boards/stores/boards_store_ee';
|
||||
import { getUrlParamsArray, parseBoolean } from '~/lib/utils/common_utils';
|
||||
import {
|
||||
urlParamsToObject,
|
||||
getUrlParamsArray,
|
||||
parseBoolean,
|
||||
convertObjectPropsToCamelCase,
|
||||
} from '~/lib/utils/common_utils';
|
||||
import { __ } from '~/locale';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
import { mergeUrlParams } from '~/lib/utils/url_utility';
|
||||
|
@ -23,7 +28,6 @@ const boardsStore = {
|
|||
limitToHours: false,
|
||||
},
|
||||
scopedLabels: {
|
||||
helpLink: '',
|
||||
enabled: false,
|
||||
},
|
||||
filter: {
|
||||
|
@ -75,7 +79,15 @@ const boardsStore = {
|
|||
this.state.currentPage = page;
|
||||
},
|
||||
addList(listObj) {
|
||||
const list = new List(listObj);
|
||||
const listType = listObj.listType || listObj.list_type;
|
||||
let { position } = listObj;
|
||||
if (listType === ListType.closed) {
|
||||
position = Infinity;
|
||||
} else if (listType === ListType.backlog) {
|
||||
position = -1;
|
||||
}
|
||||
|
||||
const list = new List({ ...listObj, position });
|
||||
this.state.lists = sortBy([...this.state.lists, list], 'position');
|
||||
return list;
|
||||
},
|
||||
|
@ -121,6 +133,50 @@ const boardsStore = {
|
|||
path: '',
|
||||
});
|
||||
},
|
||||
addListIssue(list, issue, listFrom, newIndex) {
|
||||
let moveBeforeId = null;
|
||||
let moveAfterId = null;
|
||||
|
||||
if (!list.findIssue(issue.id)) {
|
||||
if (newIndex !== undefined) {
|
||||
list.issues.splice(newIndex, 0, issue);
|
||||
|
||||
if (list.issues[newIndex - 1]) {
|
||||
moveBeforeId = list.issues[newIndex - 1].id;
|
||||
}
|
||||
|
||||
if (list.issues[newIndex + 1]) {
|
||||
moveAfterId = list.issues[newIndex + 1].id;
|
||||
}
|
||||
} else {
|
||||
list.issues.push(issue);
|
||||
}
|
||||
|
||||
if (list.label) {
|
||||
issue.addLabel(list.label);
|
||||
}
|
||||
|
||||
if (list.assignee) {
|
||||
if (listFrom && listFrom.type === 'assignee') {
|
||||
issue.removeAssignee(listFrom.assignee);
|
||||
}
|
||||
issue.addAssignee(list.assignee);
|
||||
}
|
||||
|
||||
if (IS_EE && list.milestone) {
|
||||
if (listFrom && listFrom.type === 'milestone') {
|
||||
issue.removeMilestone(listFrom.milestone);
|
||||
}
|
||||
issue.addMilestone(list.milestone);
|
||||
}
|
||||
|
||||
if (listFrom) {
|
||||
list.issuesSize += 1;
|
||||
|
||||
list.updateIssueLabel(issue, listFrom, moveBeforeId, moveAfterId);
|
||||
}
|
||||
}
|
||||
},
|
||||
welcomeIsHidden() {
|
||||
return parseBoolean(Cookies.get('issue_board_welcome_hidden'));
|
||||
},
|
||||
|
@ -487,6 +543,36 @@ const boardsStore = {
|
|||
});
|
||||
},
|
||||
|
||||
getListIssues(list, emptyIssues = true) {
|
||||
const data = {
|
||||
...urlParamsToObject(this.filter.path),
|
||||
page: list.page,
|
||||
};
|
||||
|
||||
if (list.label && data.label_name) {
|
||||
data.label_name = data.label_name.filter(label => label !== list.label.title);
|
||||
}
|
||||
|
||||
if (emptyIssues) {
|
||||
list.loading = true;
|
||||
}
|
||||
|
||||
return this.getIssuesForList(list.id, data)
|
||||
.then(res => res.data)
|
||||
.then(data => {
|
||||
list.loading = false;
|
||||
list.issuesSize = data.size;
|
||||
|
||||
if (emptyIssues) {
|
||||
list.issues = [];
|
||||
}
|
||||
|
||||
list.createIssues(data.issues);
|
||||
|
||||
return data;
|
||||
});
|
||||
},
|
||||
|
||||
getIssuesForList(id, filter = {}) {
|
||||
const data = { id };
|
||||
Object.keys(filter).forEach(key => {
|
||||
|
@ -632,6 +718,28 @@ const boardsStore = {
|
|||
issue.assignees = obj.assignees.map(a => new ListAssignee(a));
|
||||
}
|
||||
},
|
||||
updateIssue(issue) {
|
||||
const data = {
|
||||
issue: {
|
||||
milestone_id: issue.milestone ? issue.milestone.id : null,
|
||||
due_date: issue.dueDate,
|
||||
assignee_ids: issue.assignees.length > 0 ? issue.assignees.map(({ id }) => id) : [0],
|
||||
label_ids: issue.labels.length > 0 ? issue.labels.map(({ id }) => id) : [''],
|
||||
},
|
||||
};
|
||||
|
||||
return axios.patch(`${issue.path}.json`, data).then(({ data: body = {} } = {}) => {
|
||||
/**
|
||||
* Since post implementation of Scoped labels, server can reject
|
||||
* same key-ed labels. To keep the UI and server Model consistent,
|
||||
* we're just assigning labels that server echo's back to us when we
|
||||
* PATCH the said object.
|
||||
*/
|
||||
if (body) {
|
||||
issue.labels = convertObjectPropsToCamelCase(body.labels, { deep: true });
|
||||
}
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
BoardsStoreEE.initEESpecific(boardsStore);
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
import { inactiveListId } from '~/boards/constants';
|
||||
|
||||
export default () => ({
|
||||
isShowingLabels: true,
|
||||
activeListId: 0,
|
||||
activeListId: inactiveListId,
|
||||
});
|
||||
|
|
|
@ -1 +1,45 @@
|
|||
export default () => {};
|
||||
import $ from 'jquery';
|
||||
import Vue from 'vue';
|
||||
import collapseIcon from './icons/fullscreen_collapse.svg';
|
||||
import expandIcon from './icons/fullscreen_expand.svg';
|
||||
|
||||
export default (ModalStore, boardsStore) => {
|
||||
const issueBoardsContent = document.querySelector('.content-wrapper > .js-focus-mode-board');
|
||||
|
||||
return new Vue({
|
||||
el: document.getElementById('js-toggle-focus-btn'),
|
||||
data: {
|
||||
modal: ModalStore.store,
|
||||
store: boardsStore.state,
|
||||
isFullscreen: false,
|
||||
},
|
||||
methods: {
|
||||
toggleFocusMode() {
|
||||
$(this.$refs.toggleFocusModeButton).tooltip('hide');
|
||||
issueBoardsContent.classList.toggle('is-focused');
|
||||
|
||||
this.isFullscreen = !this.isFullscreen;
|
||||
},
|
||||
},
|
||||
template: `
|
||||
<div class="board-extra-actions">
|
||||
<a
|
||||
href="#"
|
||||
class="btn btn-default has-tooltip prepend-left-10 js-focus-mode-btn"
|
||||
data-qa-selector="focus_mode_button"
|
||||
role="button"
|
||||
aria-label="Toggle focus mode"
|
||||
title="Toggle focus mode"
|
||||
ref="toggleFocusModeButton"
|
||||
@click="toggleFocusMode">
|
||||
<span v-show="isFullscreen">
|
||||
${collapseIcon}
|
||||
</span>
|
||||
<span v-show="!isFullscreen">
|
||||
${expandIcon}
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
};
|
||||
|
|
|
@ -3,10 +3,10 @@ import Cookies from 'js-cookie';
|
|||
const handleOnDismiss = ({ currentTarget }) => {
|
||||
currentTarget.removeEventListener('click', handleOnDismiss);
|
||||
const {
|
||||
dataset: { id },
|
||||
dataset: { id, expireDate },
|
||||
} = currentTarget;
|
||||
|
||||
Cookies.set(`hide_broadcast_message_${id}`, true);
|
||||
Cookies.set(`hide_broadcast_message_${id}`, true, { expires: new Date(expireDate) });
|
||||
|
||||
const notification = document.querySelector(`.js-broadcast-notification-${id}`);
|
||||
notification.parentNode.removeChild(notification);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue