New upstream version 11.6.0+dfsg
This commit is contained in:
parent
7702918906
commit
3a10a60cc7
3829 changed files with 49724 additions and 25205 deletions
|
@ -35,4 +35,10 @@ if (BABEL_ENV === 'karma' || BABEL_ENV === 'coverage') {
|
|||
plugins.push('babel-plugin-rewire');
|
||||
}
|
||||
|
||||
// Jest is running in node environment
|
||||
if (BABEL_ENV === 'jest') {
|
||||
plugins.push('transform-es2015-modules-commonjs');
|
||||
plugins.push('dynamic-import-node');
|
||||
}
|
||||
|
||||
module.exports = { presets, plugins };
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
/config/
|
||||
/builds/
|
||||
/coverage/
|
||||
/coverage-frontend/
|
||||
/coverage-javascript/
|
||||
/node_modules/
|
||||
/public/
|
||||
|
|
|
@ -29,8 +29,6 @@ rules:
|
|||
import/no-useless-path-segments: off
|
||||
lines-between-class-members: off
|
||||
# Disabled for now, to make the plugin-vue 4.5 -> 5.0 update smoother
|
||||
vue/html-closing-bracket-newline: off
|
||||
vue/html-closing-bracket-spacing: off
|
||||
vue/no-confusing-v-for-v-if: error
|
||||
vue/no-unused-components: off
|
||||
vue/no-use-v-if-with-v-for: off
|
||||
|
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -78,5 +78,5 @@ eslint-report.html
|
|||
/plugins/*
|
||||
/.gitlab_pages_secret
|
||||
package-lock.json
|
||||
/junit_rspec.xml
|
||||
/junit_karma.xml
|
||||
/junit_*.xml
|
||||
/coverage-frontend/
|
||||
|
|
439
.gitlab-ci.yml
439
.gitlab-ci.yml
|
@ -1,4 +1,4 @@
|
|||
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.5-golang-1.9-git-2.18-chrome-69.0-node-8.x-yarn-1.2-postgresql-9.6-graphicsmagick-1.3.29"
|
||||
image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.5.3-golang-1.9-git-2.18-chrome-69.0-node-10.x-yarn-1.12-postgresql-9.6-graphicsmagick-1.3.29"
|
||||
|
||||
.dedicated-runner: &dedicated-runner
|
||||
retry: 1
|
||||
|
@ -6,7 +6,7 @@ image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.5-golang-1.9-git
|
|||
- gitlab-org
|
||||
|
||||
.default-cache: &default-cache
|
||||
key: "ruby-2.4.5-debian-stretch-with-yarn"
|
||||
key: "debian-stretch-ruby-2.5.3-node-10.x"
|
||||
paths:
|
||||
- vendor/ruby
|
||||
- .yarn-cache/
|
||||
|
@ -32,6 +32,7 @@ variables:
|
|||
GET_SOURCES_ATTEMPTS: "3"
|
||||
KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/${CI_PROJECT_NAME}/rspec_report-master.json
|
||||
FLAKY_RSPEC_SUITE_REPORT_PATH: rspec_flaky/report-suite.json
|
||||
BUILD_ASSETS_IMAGE: "false"
|
||||
|
||||
before_script:
|
||||
- bundle --version
|
||||
|
@ -47,6 +48,7 @@ after_script:
|
|||
stages:
|
||||
- build
|
||||
- prepare
|
||||
- merge
|
||||
- test
|
||||
- post-test
|
||||
- pages
|
||||
|
@ -75,15 +77,17 @@ stages:
|
|||
- mysql:5.7
|
||||
- redis:alpine
|
||||
|
||||
.rails5: &rails5
|
||||
allow_failure: true
|
||||
only:
|
||||
.rails4: &rails4
|
||||
allow_failure: false
|
||||
except:
|
||||
variables:
|
||||
- $CI_COMMIT_REF_NAME =~ /rails5/
|
||||
- $RAILS5_ENABLED
|
||||
- $CI_COMMIT_REF_NAME =~ /(^docs[\/-].*|.*-docs$)/
|
||||
- $CI_COMMIT_REF_NAME =~ /(^qa[\/-].*|.*-qa$)/
|
||||
- $CI_COMMIT_REF_NAME =~ /norails4/
|
||||
- $RAILS5_DISABLED
|
||||
variables:
|
||||
BUNDLE_GEMFILE: "Gemfile.rails5"
|
||||
RAILS5: "true"
|
||||
BUNDLE_GEMFILE: "Gemfile.rails4"
|
||||
RAILS5: "false"
|
||||
|
||||
# Skip all jobs except the ones that begin with 'docs/'.
|
||||
# Used for commits including ONLY documentation changes.
|
||||
|
@ -121,7 +125,7 @@ stages:
|
|||
<<: *except-docs-and-qa
|
||||
|
||||
.single-script-job: &single-script-job
|
||||
image: ruby:2.4-alpine
|
||||
image: ruby:2.5-alpine
|
||||
stage: test
|
||||
cache: {}
|
||||
dependencies: []
|
||||
|
@ -148,13 +152,12 @@ stages:
|
|||
stage: test
|
||||
script:
|
||||
- JOB_NAME=( $CI_JOB_NAME )
|
||||
- export CI_NODE_INDEX=${JOB_NAME[-2]}
|
||||
- export CI_NODE_TOTAL=${JOB_NAME[-1]}
|
||||
- export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${JOB_NAME[0]}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- TEST_TOOL=${JOB_NAME[0]}
|
||||
- export KNAPSACK_REPORT_PATH=knapsack/${CI_PROJECT_NAME}/${TEST_TOOL}_node_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- export KNAPSACK_GENERATE_REPORT=true
|
||||
- export SUITE_FLAKY_RSPEC_REPORT_PATH=${FLAKY_RSPEC_SUITE_REPORT_PATH}
|
||||
- export FLAKY_RSPEC_REPORT_PATH=rspec_flaky/all_${JOB_NAME[0]}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- export NEW_FLAKY_RSPEC_REPORT_PATH=rspec_flaky/new_${JOB_NAME[0]}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- export FLAKY_RSPEC_REPORT_PATH=rspec_flaky/all_${TEST_TOOL}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- export NEW_FLAKY_RSPEC_REPORT_PATH=rspec_flaky/new_${TEST_TOOL}_${CI_NODE_INDEX}_${CI_NODE_TOTAL}_report.json
|
||||
- export FLAKY_RSPEC_GENERATE_REPORT=true
|
||||
- export CACHE_CLASSES=true
|
||||
- cp ${KNAPSACK_RSPEC_SUITE_REPORT_PATH} ${KNAPSACK_REPORT_PATH}
|
||||
|
@ -177,17 +180,17 @@ stages:
|
|||
<<: *rspec-metadata
|
||||
<<: *use-pg
|
||||
|
||||
.rspec-metadata-pg-rails5: &rspec-metadata-pg-rails5
|
||||
.rspec-metadata-pg-rails4: &rspec-metadata-pg-rails4
|
||||
<<: *rspec-metadata-pg
|
||||
<<: *rails5
|
||||
<<: *rails4
|
||||
|
||||
.rspec-metadata-mysql: &rspec-metadata-mysql
|
||||
<<: *rspec-metadata
|
||||
<<: *use-mysql
|
||||
|
||||
.rspec-metadata-mysql-rails5: &rspec-metadata-mysql-rails5
|
||||
.rspec-metadata-mysql-rails4: &rspec-metadata-mysql-rails4
|
||||
<<: *rspec-metadata-mysql
|
||||
<<: *rails5
|
||||
<<: *rails4
|
||||
|
||||
.only-canonical-masters: &only-canonical-masters
|
||||
only:
|
||||
|
@ -227,6 +230,8 @@ stages:
|
|||
script:
|
||||
- git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v9.3.0
|
||||
- git checkout -f FETCH_HEAD
|
||||
- sed -i "s/gem 'oj', '~> 2.17.4'//" Gemfile
|
||||
- bundle update google-protobuf grpc
|
||||
- bundle install $BUNDLE_INSTALL_FLAGS
|
||||
- date
|
||||
- cp config/gitlab.yml.example config/gitlab.yml
|
||||
|
@ -316,7 +321,7 @@ review-docs-cleanup:
|
|||
# Trigger a docker image build in CNG (Cloud Native GitLab) repository
|
||||
#
|
||||
cloud-native-image:
|
||||
image: ruby:2.4-alpine
|
||||
image: ruby:2.5-alpine
|
||||
before_script: []
|
||||
dependencies: []
|
||||
stage: post-test
|
||||
|
@ -369,7 +374,7 @@ update-tests-metadata:
|
|||
|
||||
flaky-examples-check:
|
||||
<<: *dedicated-runner
|
||||
image: ruby:2.4-alpine
|
||||
image: ruby:2.5-alpine
|
||||
services: []
|
||||
before_script: []
|
||||
variables:
|
||||
|
@ -427,7 +432,7 @@ setup-test-env:
|
|||
script:
|
||||
- bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init'
|
||||
- scripts/gitaly-test-build # Do not use 'bundle exec' here
|
||||
- BUNDLE_GEMFILE=Gemfile.rails5 bundle install $BUNDLE_INSTALL_FLAGS
|
||||
- BUNDLE_GEMFILE=Gemfile.rails4 bundle install $BUNDLE_INSTALL_FLAGS
|
||||
artifacts:
|
||||
expire_in: 7d
|
||||
paths:
|
||||
|
@ -435,11 +440,54 @@ setup-test-env:
|
|||
- config/secrets.yml
|
||||
- vendor/gitaly-ruby
|
||||
|
||||
# GitLab Review apps
|
||||
.review-base: &review-base
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-charts-build-base
|
||||
stage: test
|
||||
cache: {}
|
||||
dependencies: []
|
||||
environment: &review-environment
|
||||
name: review/${CI_COMMIT_REF_NAME}
|
||||
url: https://gitlab-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}
|
||||
only:
|
||||
refs:
|
||||
- branches@gitlab-org/gitlab-ce
|
||||
- branches@gitlab-org/gitlab-ee
|
||||
kubernetes: active
|
||||
except:
|
||||
refs:
|
||||
- master
|
||||
- /(^docs[\/-].*|.*-docs$)/
|
||||
before_script: []
|
||||
|
||||
.review-docker: &review-docker
|
||||
<<: *review-base
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-qa-alpine
|
||||
services:
|
||||
- docker:stable-dind
|
||||
tags:
|
||||
- gitlab-org
|
||||
- docker
|
||||
variables: &review-docker-variables
|
||||
GIT_DEPTH: "1"
|
||||
DOCKER_DRIVER: overlay2
|
||||
DOCKER_HOST: tcp://docker:2375
|
||||
LATEST_QA_IMAGE: "gitlab/${CI_PROJECT_NAME}-qa:nightly"
|
||||
QA_IMAGE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab/${CI_PROJECT_NAME}-qa:${CI_COMMIT_REF_SLUG}"
|
||||
|
||||
build-qa-image:
|
||||
<<: *review-docker
|
||||
stage: prepare
|
||||
script:
|
||||
- time docker build --cache-from ${LATEST_QA_IMAGE} --tag ${QA_IMAGE} ./qa/
|
||||
- echo "${CI_JOB_TOKEN}" | docker login --username gitlab-ci-token --password-stdin ${CI_REGISTRY}
|
||||
- time docker push ${QA_IMAGE}
|
||||
|
||||
danger-review:
|
||||
<<: *pull-cache
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:danger
|
||||
stage: test
|
||||
allow_failure: true
|
||||
dependencies: []
|
||||
before_script: []
|
||||
only:
|
||||
|
@ -457,129 +505,21 @@ danger-review:
|
|||
- yarn install --frozen-lockfile --cache-folder .yarn-cache
|
||||
- danger --fail-on-errors=true
|
||||
|
||||
rspec-pg 0 30: *rspec-metadata-pg
|
||||
rspec-pg 1 30: *rspec-metadata-pg
|
||||
rspec-pg 2 30: *rspec-metadata-pg
|
||||
rspec-pg 3 30: *rspec-metadata-pg
|
||||
rspec-pg 4 30: *rspec-metadata-pg
|
||||
rspec-pg 5 30: *rspec-metadata-pg
|
||||
rspec-pg 6 30: *rspec-metadata-pg
|
||||
rspec-pg 7 30: *rspec-metadata-pg
|
||||
rspec-pg 8 30: *rspec-metadata-pg
|
||||
rspec-pg 9 30: *rspec-metadata-pg
|
||||
rspec-pg 10 30: *rspec-metadata-pg
|
||||
rspec-pg 11 30: *rspec-metadata-pg
|
||||
rspec-pg 12 30: *rspec-metadata-pg
|
||||
rspec-pg 13 30: *rspec-metadata-pg
|
||||
rspec-pg 14 30: *rspec-metadata-pg
|
||||
rspec-pg 15 30: *rspec-metadata-pg
|
||||
rspec-pg 16 30: *rspec-metadata-pg
|
||||
rspec-pg 17 30: *rspec-metadata-pg
|
||||
rspec-pg 18 30: *rspec-metadata-pg
|
||||
rspec-pg 19 30: *rspec-metadata-pg
|
||||
rspec-pg 20 30: *rspec-metadata-pg
|
||||
rspec-pg 21 30: *rspec-metadata-pg
|
||||
rspec-pg 22 30: *rspec-metadata-pg
|
||||
rspec-pg 23 30: *rspec-metadata-pg
|
||||
rspec-pg 24 30: *rspec-metadata-pg
|
||||
rspec-pg 25 30: *rspec-metadata-pg
|
||||
rspec-pg 26 30: *rspec-metadata-pg
|
||||
rspec-pg 27 30: *rspec-metadata-pg
|
||||
rspec-pg 28 30: *rspec-metadata-pg
|
||||
rspec-pg 29 30: *rspec-metadata-pg
|
||||
rspec-pg:
|
||||
<<: *rspec-metadata-pg
|
||||
parallel: 50
|
||||
|
||||
rspec-mysql 0 30: *rspec-metadata-mysql
|
||||
rspec-mysql 1 30: *rspec-metadata-mysql
|
||||
rspec-mysql 2 30: *rspec-metadata-mysql
|
||||
rspec-mysql 3 30: *rspec-metadata-mysql
|
||||
rspec-mysql 4 30: *rspec-metadata-mysql
|
||||
rspec-mysql 5 30: *rspec-metadata-mysql
|
||||
rspec-mysql 6 30: *rspec-metadata-mysql
|
||||
rspec-mysql 7 30: *rspec-metadata-mysql
|
||||
rspec-mysql 8 30: *rspec-metadata-mysql
|
||||
rspec-mysql 9 30: *rspec-metadata-mysql
|
||||
rspec-mysql 10 30: *rspec-metadata-mysql
|
||||
rspec-mysql 11 30: *rspec-metadata-mysql
|
||||
rspec-mysql 12 30: *rspec-metadata-mysql
|
||||
rspec-mysql 13 30: *rspec-metadata-mysql
|
||||
rspec-mysql 14 30: *rspec-metadata-mysql
|
||||
rspec-mysql 15 30: *rspec-metadata-mysql
|
||||
rspec-mysql 16 30: *rspec-metadata-mysql
|
||||
rspec-mysql 17 30: *rspec-metadata-mysql
|
||||
rspec-mysql 18 30: *rspec-metadata-mysql
|
||||
rspec-mysql 19 30: *rspec-metadata-mysql
|
||||
rspec-mysql 20 30: *rspec-metadata-mysql
|
||||
rspec-mysql 21 30: *rspec-metadata-mysql
|
||||
rspec-mysql 22 30: *rspec-metadata-mysql
|
||||
rspec-mysql 23 30: *rspec-metadata-mysql
|
||||
rspec-mysql 24 30: *rspec-metadata-mysql
|
||||
rspec-mysql 25 30: *rspec-metadata-mysql
|
||||
rspec-mysql 26 30: *rspec-metadata-mysql
|
||||
rspec-mysql 27 30: *rspec-metadata-mysql
|
||||
rspec-mysql 28 30: *rspec-metadata-mysql
|
||||
rspec-mysql 29 30: *rspec-metadata-mysql
|
||||
rspec-mysql:
|
||||
<<: *rspec-metadata-mysql
|
||||
parallel: 50
|
||||
|
||||
rspec-pg-rails5 0 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 1 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 2 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 3 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 4 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 5 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 6 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 7 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 8 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 9 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 10 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 11 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 12 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 13 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 14 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 15 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 16 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 17 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 18 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 19 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 20 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 21 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 22 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 23 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 24 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 25 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 26 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 27 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 28 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails5 29 30: *rspec-metadata-pg-rails5
|
||||
rspec-pg-rails4:
|
||||
<<: *rspec-metadata-pg-rails4
|
||||
parallel: 50
|
||||
|
||||
rspec-mysql-rails5 0 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 1 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 2 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 3 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 4 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 5 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 6 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 7 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 8 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 9 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 10 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 11 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 12 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 13 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 14 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 15 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 16 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 17 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 18 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 19 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 20 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 21 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 22 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 23 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 24 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 25 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 26 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 27 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 28 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails5 29 30: *rspec-metadata-mysql-rails5
|
||||
rspec-mysql-rails4:
|
||||
<<: *rspec-metadata-mysql-rails4
|
||||
parallel: 50
|
||||
|
||||
static-analysis:
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
|
@ -589,7 +529,7 @@ static-analysis:
|
|||
script:
|
||||
- scripts/static-analysis
|
||||
cache:
|
||||
key: "ruby-2.4.5-debian-stretch-with-yarn-and-rubocop"
|
||||
key: "debian-stretch-ruby-2.5.3-node-10.x-and-rubocop"
|
||||
paths:
|
||||
- vendor/ruby
|
||||
- .yarn-cache/
|
||||
|
@ -614,7 +554,8 @@ docs lint:
|
|||
# Build HTML from Markdown
|
||||
- bundle exec nanoc
|
||||
# Check the internal links
|
||||
- bundle exec nanoc check internal_links
|
||||
# Disabled until https://gitlab.com/gitlab-com/gitlab-docs/issues/305 is resolved
|
||||
# - bundle exec nanoc check internal_links
|
||||
|
||||
downtime_check:
|
||||
<<: *rake-exec
|
||||
|
@ -625,14 +566,15 @@ downtime_check:
|
|||
- /(^docs[\/-].*|.*-docs$)/
|
||||
- /(^qa[\/-].*|.*-qa$)/
|
||||
|
||||
rails5_gemfile_lock_check:
|
||||
rails4_gemfile_lock_check:
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
<<: *except-docs-and-qa
|
||||
script:
|
||||
- scripts/rails5-gemfile-lock-check
|
||||
- scripts/rails4-gemfile-lock-check
|
||||
|
||||
ee_compat_check:
|
||||
<<: *rake-exec
|
||||
dependencies: []
|
||||
except:
|
||||
- master
|
||||
- tags
|
||||
|
@ -695,7 +637,7 @@ gitlab:setup-mysql:
|
|||
# Frontend-related jobs
|
||||
gitlab:assets:compile:
|
||||
<<: *dedicated-no-docs-and-no-qa-pull-cache-job
|
||||
image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.4.4-git-2.18-chrome-69.0-node-8.x-yarn-1.2-graphicsmagick-1.3.29-docker-18.06.1
|
||||
image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.5.3-git-2.18-chrome-69.0-node-8.x-yarn-1.2-graphicsmagick-1.3.29-docker-18.06.1
|
||||
dependencies: []
|
||||
services:
|
||||
- docker:stable-dind
|
||||
|
@ -722,8 +664,14 @@ gitlab:assets:compile:
|
|||
paths:
|
||||
- webpack-report/
|
||||
- public/assets/
|
||||
only:
|
||||
- //@gitlab-org/gitlab-ce
|
||||
- //@gitlab-org/gitlab-ee
|
||||
- //@gitlab/gitlabhq
|
||||
- //@gitlab/gitlab-ee
|
||||
tags:
|
||||
- docker
|
||||
- gitlab-org-delivery
|
||||
- high-cpu
|
||||
|
||||
karma:
|
||||
<<: *dedicated-no-docs-pull-cache-job
|
||||
|
@ -751,6 +699,32 @@ karma:
|
|||
reports:
|
||||
junit: junit_karma.xml
|
||||
|
||||
jest:
|
||||
<<: *dedicated-no-docs-and-no-qa-pull-cache-job
|
||||
<<: *use-pg
|
||||
dependencies:
|
||||
- compile-assets
|
||||
- setup-test-env
|
||||
script:
|
||||
- scripts/gitaly-test-spawn
|
||||
- date
|
||||
- bundle exec rake karma:fixtures
|
||||
- date
|
||||
- yarn jest --ci --coverage
|
||||
artifacts:
|
||||
name: coverage-frontend
|
||||
expire_in: 31d
|
||||
when: always
|
||||
paths:
|
||||
- coverage-frontend/
|
||||
- junit_jest.xml
|
||||
reports:
|
||||
junit: junit_jest.xml
|
||||
cache:
|
||||
key: jest
|
||||
paths:
|
||||
- tmp/jest/jest/
|
||||
|
||||
code_quality:
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
image: docker:stable
|
||||
|
@ -775,7 +749,8 @@ code_quality:
|
|||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
|
||||
artifacts:
|
||||
paths: [gl-code-quality-report.json]
|
||||
reports:
|
||||
codequality: gl-code-quality-report.json
|
||||
expire_in: 1 week
|
||||
|
||||
sast:
|
||||
|
@ -799,7 +774,8 @@ sast:
|
|||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/sast:$SP_VERSION" /app/bin/run /code
|
||||
artifacts:
|
||||
paths: [gl-sast-report.json]
|
||||
reports:
|
||||
sast: gl-sast-report.json
|
||||
|
||||
dependency_scanning:
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
|
@ -821,7 +797,8 @@ dependency_scanning:
|
|||
--volume /var/run/docker.sock:/var/run/docker.sock
|
||||
"registry.gitlab.com/gitlab-org/security-products/dependency-scanning:$SP_VERSION" /code
|
||||
artifacts:
|
||||
paths: [gl-dependency-scanning-report.json]
|
||||
reports:
|
||||
dependency_scanning: gl-dependency-scanning-report.json
|
||||
|
||||
qa:internal:
|
||||
<<: *dedicated-no-docs-no-db-pull-cache-job
|
||||
|
@ -839,6 +816,40 @@ qa:selectors:
|
|||
- bundle install
|
||||
- bundle exec bin/qa Test::Sanity::Selectors
|
||||
|
||||
.qa-frontend-node: &qa-frontend-node
|
||||
stage: test
|
||||
variables:
|
||||
NODE_OPTIONS: --max_old_space_size=3584
|
||||
cache:
|
||||
key: "$CI_JOB_NAME"
|
||||
paths:
|
||||
- .yarn-cache/
|
||||
dependencies: []
|
||||
before_script: []
|
||||
script:
|
||||
- date
|
||||
- yarn install --frozen-lockfile --cache-folder .yarn-cache
|
||||
- date
|
||||
- yarn run webpack-prod
|
||||
<<: *except-docs
|
||||
|
||||
qa-frontend-node:6:
|
||||
<<: *qa-frontend-node
|
||||
image: node:6-alpine
|
||||
|
||||
qa-frontend-node:8:
|
||||
<<: *qa-frontend-node
|
||||
image: node:8-alpine
|
||||
|
||||
qa-frontend-node:10:
|
||||
<<: *qa-frontend-node
|
||||
image: node:10-alpine
|
||||
|
||||
qa-frontend-node:latest:
|
||||
<<: *qa-frontend-node
|
||||
image: node:alpine
|
||||
allow_failure: true
|
||||
|
||||
coverage:
|
||||
# Don't include dedicated-no-docs-no-db-pull-cache-job here since we need to
|
||||
# download artifacts from all the rspec jobs instead of from setup-test-env only
|
||||
|
@ -861,9 +872,7 @@ coverage:
|
|||
lint:javascript:report:
|
||||
<<: *dedicated-no-docs-and-no-qa-pull-cache-job
|
||||
stage: post-test
|
||||
dependencies:
|
||||
- compile-assets
|
||||
- setup-test-env
|
||||
dependencies: []
|
||||
before_script: []
|
||||
script:
|
||||
- date
|
||||
|
@ -890,6 +899,8 @@ pages:
|
|||
- mv coverage-javascript/ public/coverage-javascript/ || true
|
||||
- mv eslint-report.html public/ || true
|
||||
- mv webpack-report/ public/webpack-report/ || true
|
||||
- cp .public/assets/application-*.css public/application.css || true
|
||||
- cp .public/assets/application-*.css.gz public/application.css.gz || true
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
|
@ -917,6 +928,7 @@ gitlab_git_test:
|
|||
variables:
|
||||
SETUP_DB: "false"
|
||||
before_script: []
|
||||
dependencies: []
|
||||
cache: {}
|
||||
script:
|
||||
- spec/support/prepare-gitlab-git-test-for-commit --check-for-changes
|
||||
|
@ -927,6 +939,7 @@ no_ee_check:
|
|||
variables:
|
||||
SETUP_DB: "false"
|
||||
before_script: []
|
||||
dependencies: []
|
||||
cache: {}
|
||||
script:
|
||||
- scripts/no-ee-check
|
||||
|
@ -934,86 +947,102 @@ no_ee_check:
|
|||
- //@gitlab-org/gitlab-ce
|
||||
|
||||
# GitLab Review apps
|
||||
review:
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-charts-build-base
|
||||
stage: test
|
||||
review-deploy:
|
||||
<<: *review-base
|
||||
retry: 2
|
||||
allow_failure: true
|
||||
before_script:
|
||||
- gem install gitlab --no-document
|
||||
variables:
|
||||
GIT_DEPTH: "1"
|
||||
HOST_SUFFIX: "$CI_ENVIRONMENT_SLUG"
|
||||
DOMAIN: "-$CI_ENVIRONMENT_SLUG.$REVIEW_APPS_DOMAIN"
|
||||
HOST_SUFFIX: "${CI_ENVIRONMENT_SLUG}"
|
||||
DOMAIN: "-${CI_ENVIRONMENT_SLUG}.${REVIEW_APPS_DOMAIN}"
|
||||
GITLAB_HELM_CHART_REF: "master"
|
||||
API_TOKEN: "${GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN}"
|
||||
environment:
|
||||
<<: *review-environment
|
||||
on_stop: review-stop
|
||||
before_script:
|
||||
- apk update && apk add jq
|
||||
- gem install gitlab --no-document
|
||||
script:
|
||||
- export GITLAB_SHELL_VERSION=$(<GITLAB_SHELL_VERSION)
|
||||
- export GITALY_VERSION=$(<GITALY_SERVER_VERSION)
|
||||
- export GITLAB_WORKHORSE_VERSION=$(<GITLAB_WORKHORSE_VERSION)
|
||||
- source ./scripts/review_apps/review-apps.sh
|
||||
- wait_for_job_to_be_done "gitlab:assets:compile"
|
||||
- BUILD_TRIGGER_TOKEN=$REVIEW_APPS_BUILD_TRIGGER_TOKEN ./scripts/trigger-build cng
|
||||
- check_kube_domain
|
||||
- download_gitlab_chart
|
||||
- ensure_namespace
|
||||
- install_tiller
|
||||
- create_secret
|
||||
- install_external_dns
|
||||
- deploy
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
url: https://gitlab-$CI_ENVIRONMENT_SLUG.$REVIEW_APPS_DOMAIN
|
||||
on_stop: stop_review
|
||||
only:
|
||||
refs:
|
||||
- branches@gitlab-org/gitlab-ce
|
||||
- branches@gitlab-org/gitlab-ee
|
||||
kubernetes: active
|
||||
except:
|
||||
refs:
|
||||
- master
|
||||
- /(^docs[\/-].*|.*-docs$)/
|
||||
- time deploy
|
||||
- add_license
|
||||
|
||||
stop_review:
|
||||
.review-qa-base: &review-qa-base
|
||||
<<: *review-docker
|
||||
retry: 2
|
||||
allow_failure: true
|
||||
variables:
|
||||
<<: *review-docker-variables
|
||||
API_TOKEN: "${GITLAB_BOT_MULTI_PROJECT_PIPELINE_POLLING_TOKEN}"
|
||||
QA_ARTIFACTS_DIR: "${CI_PROJECT_DIR}/qa"
|
||||
QA_CAN_TEST_GIT_PROTOCOL_V2: "false"
|
||||
GITLAB_USERNAME: "root"
|
||||
GITLAB_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
|
||||
GITLAB_ADMIN_USERNAME: "root"
|
||||
GITLAB_ADMIN_PASSWORD: "${REVIEW_APPS_ROOT_PASSWORD}"
|
||||
GITHUB_ACCESS_TOKEN: "${REVIEW_APPS_QA_GITHUB_ACCESS_TOKEN}"
|
||||
EE_LICENSE: "${REVIEW_APPS_EE_LICENSE}"
|
||||
QA_DEBUG: "true"
|
||||
artifacts:
|
||||
paths:
|
||||
- ./qa/gitlab-qa-run-*
|
||||
expire_in: 7 days
|
||||
when: always
|
||||
before_script:
|
||||
- echo "${QA_IMAGE}"
|
||||
- echo "${CI_ENVIRONMENT_URL}"
|
||||
- apk update && apk add curl jq
|
||||
- source ./scripts/review_apps/review-apps.sh
|
||||
- gem install gitlab-qa --no-document ${GITLAB_QA_VERSION:+ --version ${GITLAB_QA_VERSION}}
|
||||
- wait_for_job_to_be_done "review-deploy"
|
||||
|
||||
review-qa-smoke:
|
||||
<<: *review-qa-base
|
||||
script:
|
||||
- gitlab-qa Test::Instance::Smoke "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
|
||||
|
||||
review-qa-all:
|
||||
<<: *review-qa-base
|
||||
script:
|
||||
- gitlab-qa Test::Instance::Any "${QA_IMAGE}" "${CI_ENVIRONMENT_URL}"
|
||||
when: manual
|
||||
|
||||
review-stop:
|
||||
<<: *review-base
|
||||
<<: *single-script-job
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-charts-build-base
|
||||
stage: test
|
||||
allow_failure: true
|
||||
cache: {}
|
||||
dependencies: []
|
||||
variables:
|
||||
<<: *single-script-job-variables
|
||||
SCRIPT_NAME: "review_apps/review-apps.sh"
|
||||
when: manual
|
||||
environment:
|
||||
<<: *review-environment
|
||||
action: stop
|
||||
script:
|
||||
- source $(basename "${SCRIPT_NAME}")
|
||||
- delete
|
||||
- cleanup
|
||||
when: manual
|
||||
environment:
|
||||
name: review/$CI_COMMIT_REF_NAME
|
||||
action: stop
|
||||
only:
|
||||
refs:
|
||||
- branches@gitlab-org/gitlab-ce
|
||||
- branches@gitlab-org/gitlab-ee
|
||||
kubernetes: active
|
||||
except:
|
||||
- master
|
||||
- /(^docs[\/-].*|.*-docs$)/
|
||||
|
||||
schedule:review_apps_cleanup:
|
||||
<<: *dedicated-no-docs-pull-cache-job
|
||||
image: registry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-charts-build-base
|
||||
schedule:review-cleanup:
|
||||
<<: *review-base
|
||||
stage: build
|
||||
allow_failure: true
|
||||
cache: {}
|
||||
dependencies: []
|
||||
before_script:
|
||||
- gem install gitlab --no-document
|
||||
variables:
|
||||
GIT_DEPTH: "1"
|
||||
script:
|
||||
- ruby -rrubygems scripts/review_apps/automated_cleanup.rb
|
||||
environment:
|
||||
name: review/auto-cleanup
|
||||
action: stop
|
||||
only:
|
||||
refs:
|
||||
- schedules@gitlab-org/gitlab-ce
|
||||
|
@ -1022,3 +1051,7 @@ schedule:review_apps_cleanup:
|
|||
except:
|
||||
- tags
|
||||
- /(^docs[\/-].*|.*-docs$)/
|
||||
before_script:
|
||||
- gem install gitlab --no-document
|
||||
script:
|
||||
- ruby -rrubygems scripts/review_apps/automated_cleanup.rb
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
/doc/ @axil @marcia
|
||||
|
||||
# Frontend maintainers should see everything in `app/assets/`
|
||||
app/assets/ @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann
|
||||
*.scss @annabeldunstone @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann
|
||||
app/assets/ @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya
|
||||
*.scss @annabeldunstone @ClemMakesApps @fatihacet @filipa @iamphill @mikegreiling @timzallmann @kushalpandya
|
||||
|
||||
# Someone from the database team should review changes in `db/`
|
||||
db/ @abrandl @NikolayS
|
||||
|
|
|
@ -1,14 +1,22 @@
|
|||
### Problem to solve
|
||||
|
||||
<!--- What problem do we solve? -->
|
||||
|
||||
### Target audience
|
||||
|
||||
<!--- For whom are we doing this? Include either a persona from https://design.gitlab.com/#/getting-started/personas or define a specific company role. e.a. "Release Manager" or "Security Analyst" -->
|
||||
|
||||
### Further details
|
||||
|
||||
(Include use cases, benefits, and/or goals)
|
||||
<!--- Include use cases, benefits, and/or goals (contributes to our vision?) -->
|
||||
|
||||
### Proposal
|
||||
|
||||
<!--- How are we going to solve the problem? -->
|
||||
|
||||
### What does success look like, and how can we measure that?
|
||||
|
||||
(If no way to measure success, link to an issue that will implement a way to measure this)
|
||||
<!--- If no way to measure success, link to an issue that will implement a way to measure this -->
|
||||
|
||||
### Links / references
|
||||
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
### Background:
|
||||
|
||||
(Include problem, use cases, benefits, and/or goals)
|
||||
|
||||
**What questions are you trying to answer?**
|
||||
|
||||
**Are you looking to verify an existing hypothesis or uncover new issues you should be exploring?**
|
||||
|
||||
**What is the backstory of this project and how does it impact the approach?**
|
||||
|
||||
**What do you already know about the areas you are exploring?**
|
||||
|
||||
**What does success look like at the end of the project?**
|
||||
|
||||
### Links / references:
|
||||
|
||||
/label ~"UX research"
|
|
@ -16,6 +16,7 @@ Set the title to: `[Security] Description of the original issue`
|
|||
- [ ] Add a link to the MR to the [links section](#links)
|
||||
- [ ] Add a link to an EE MR if required
|
||||
- [ ] Make sure the MR remains in-progress and gets approved after the review cycle, **but never merged**.
|
||||
- [ ] Add a link to this issue on the original security issue.
|
||||
|
||||
#### Backports
|
||||
|
||||
|
@ -37,6 +38,7 @@ Set the title to: `[Security] Description of the original issue`
|
|||
- [ ] 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)
|
||||
- [ ] Once your `master` MR is merged, comment on the original security issue with a link to that MR indicating the issue is fixed.
|
||||
|
||||
### Summary
|
||||
|
||||
|
|
|
@ -64,7 +64,7 @@ Some features might be simple enough that they only involve one Component, while
|
|||
more complex features could involve multiple or even all.
|
||||
|
||||
Example (from https://gitlab.com/gitlab-org/gitlab-ce/issues/50353):
|
||||
* Respository is
|
||||
* Repository is
|
||||
* Intuitive
|
||||
* It's easy to select the desired file template
|
||||
* It doesn't require unnecessary actions to save the change
|
||||
|
@ -93,4 +93,4 @@ When adding new automated tests, please keep [testing levels](https://docs.gitla
|
|||
in mind.
|
||||
-->
|
||||
|
||||
/label ~Quality ~"test plan"
|
||||
/label ~Quality ~"test plan"
|
||||
|
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
|||
8.11.3
|
||||
10.13.0
|
||||
|
|
|
@ -50,7 +50,6 @@ Style/FrozenStringLiteralComment:
|
|||
- 'danger/**/*'
|
||||
- 'db/**/*'
|
||||
- 'ee/**/*'
|
||||
- 'lib/gitlab/**/*'
|
||||
- 'lib/tasks/**/*'
|
||||
- 'qa/**/*'
|
||||
- 'rubocop/**/*'
|
||||
|
|
|
@ -1 +1 @@
|
|||
2.4.5
|
||||
2.5.3
|
||||
|
|
381
CHANGELOG.md
381
CHANGELOG.md
|
@ -2,18 +2,281 @@
|
|||
documentation](doc/development/changelog.md) for instructions on adding your own
|
||||
entry.
|
||||
|
||||
## 11.5.5 (2018-12-20)
|
||||
## 11.6.0 (2018-12-22)
|
||||
|
||||
### Security (1 change)
|
||||
### Security (24 changes, 1 of them is from the community)
|
||||
|
||||
- Fix possible XSS attack in Markdown urls with spaces. !2599
|
||||
- Update rack to 2.0.6 (for QA environments). !23171 (Takuya Noguchi)
|
||||
- Bump nokogiri, loofah, and rack gems for security updates. !23204
|
||||
- Encrypt runners tokens. !23412
|
||||
- Encrypt CI/CD builds authentication tokens. !23436
|
||||
- Configure mermaid to not render HTML content in diagrams.
|
||||
- Fix a possible symlink time of check to time of use race condition in GitLab Pages.
|
||||
- Removed ability to see private group names when the group id is entered in the url.
|
||||
- Fix stored XSS for Environments.
|
||||
- Fix persistent symlink in project import.
|
||||
|
||||
|
||||
## 11.5.4 (2018-12-13)
|
||||
|
||||
### Security (1 change)
|
||||
|
||||
- Fixed ability of guest users to edit/delete comments on locked or confidential issues.
|
||||
- Fixed ability to comment on locked/confidential issues.
|
||||
- Fix CRLF vulnerability in Project hooks.
|
||||
- Fix SSRF in project integrations.
|
||||
- Resolve reflected XSS in Ouath authorize window.
|
||||
- Restrict Personal Access Tokens to API scope on web requests.
|
||||
- Provide email notification when a user changes their email address.
|
||||
- Don't expose confidential information in commit message list.
|
||||
- Validate LFS hrefs before downloading them.
|
||||
- Do not follow redirects in Prometheus service when making http requests to the configured api url.
|
||||
- Escape user fullname while rendering autocomplete template to prevent XSS.
|
||||
- Redact sensitive information on gitlab-workhorse log.
|
||||
- Fix milestone promotion authorization check.
|
||||
- Prevent a path traversal attack on global file templates.
|
||||
|
||||
### Removed (1 change)
|
||||
|
||||
- Remove obsolete gitlab_shell rake tasks. !22417
|
||||
|
||||
### Fixed (86 changes, 13 of them are from the community)
|
||||
|
||||
- Remove limit of 100 when searching repository code. !8671
|
||||
- Show error message when attempting to reopen an MR and there is an open MR for the same branch. !16447 (Akos Gyimesi)
|
||||
- Fix a bug where internal email pattern wasn't respected. !22516
|
||||
- Fix project selector consistency in groups issues / MRs / boards pages. !22612 (Heinrich Lee Yu)
|
||||
- Add empty state for graphs with no values. !22630
|
||||
- Fix navigating by unresolved discussions on Merge Request page. !22789
|
||||
- Fix "merged with [commit]" info for merge requests being merged automatically by other actions. !22794
|
||||
- Fixing regression issues on pages settings and details. !22821
|
||||
- Remove duplicate primary button in dashboard snippets on small viewports. !22902 (George Tsiolis)
|
||||
- Fix API::Namespaces routing to accept namepaces with dots. !22912
|
||||
- Switch kubernetes:active with checking in Auto-DevOps.gitlab-ci.yml. !22929
|
||||
- Avoid Gitaly RPC errors when fetching diff stats. !22995
|
||||
- Removes promote to group label for anonymous user. !23042 (Jacopo Beschi @jacopo-beschi)
|
||||
- Fix enabling project deploy key for admins. !23043
|
||||
- Align issue status label and confidential icon. !23046 (George Tsiolis)
|
||||
- Fix default sorting for subgroups and projects list. !23058 (Jacopo Beschi @jacopo-beschi)
|
||||
- Hashed Storage: allow migration to be retried in partially migrated projects. !23087
|
||||
- Fix line height of numbers in file blame view. !23090 (Johann Hubert Sonntagbauer)
|
||||
- Fixes an issue where default values from models would override values set in the interface (e.g. users would be set to external even though their emails matches the internal email address pattern). !23114
|
||||
- Remove display of local Sidekiq process in /admin/sidekiq. !23118
|
||||
- Fix unrelated deployment status in MR widget. !23175
|
||||
- Respect confirmed flag on secondary emails. !23181
|
||||
- Restrict member access level to be higher than that of any parent group. !23226
|
||||
- Return real deployment status to frontend. !23270
|
||||
- Handle force_remove_source_branch when creating merge request. !23281
|
||||
- Avoid creating invalid refs using rugged, shelling out for writing refs. !23286
|
||||
- Remove needless auto-capitalization on Wiki page titles. !23288
|
||||
- Modify the wording for the knative cluster application to match upstream. !23289 (Chris Baumbauer)
|
||||
- Change container width for project import. !23318 (George Tsiolis)
|
||||
- Validate chunk size when persist. !23341
|
||||
- Resolve Main navbar is broken in certain viewport widths. !23348
|
||||
- Gracefully handle references with null bytes. !23365
|
||||
- Display commit ID for commit diff discussion on merge request. !23370
|
||||
- Pass commit when posting diff discussions. !23371
|
||||
- Fix flash notice styling for fluid layout. !23382
|
||||
- Add monkey patch to unicorn to fix eof? problem. !23385
|
||||
- Commits API: Preserve file content in move operations if unspecified. !23387
|
||||
- Disable password autocomplete in mirror form fill. !23402
|
||||
- Fix "protected branches only" checkbox not set properly at init. !23409
|
||||
- Support RSA and ECDSA algorithms in Omniauth JWT provider. !23411 (Michael Tsyganov)
|
||||
- Make KUBECONFIG nil if KUBE_TOKEN is nil. !23414
|
||||
- Allow search and sort users at same time on admin users page. !23439
|
||||
- Fix: Unstar icon button is misaligned. !23444
|
||||
- Fix error when searching for group issues with priority or popularity sort. !23445
|
||||
- Fix Order By dropdown menu styling in tablet and mobile screens. !23446
|
||||
- Fix collapsing discussion replies. !23462
|
||||
- Gracefully handle unknown/invalid GPG keys. !23492
|
||||
- Fix multiple commits shade overlapping vertical discussion line. !23515
|
||||
- Use read_repository scope on read-only files API. !23534
|
||||
- Avoid 500's when serializing legacy diff notes. !23544
|
||||
- Fix web hook functionality when the database encryption key is too short. !23573
|
||||
- Hide Knative from group cluster applications until supported. !23577
|
||||
- Add top padding for nested environment items loading icon. !23580 (George Tsiolis)
|
||||
- Improve help and validation sections of maximum build timeout inputs. !23586
|
||||
- Fix milestone select in issue sidebar of issue boards. !23625
|
||||
- Fix gitlab:web_hook tasks. !23635
|
||||
- Avoid caching BroadcastMessage as an ActiveRecord object. !23662
|
||||
- Only allow strings in URL::Sanitizer.valid?. !23675
|
||||
- Fix a frozen string error in app/mailers/notify.rb. !23683
|
||||
- Fix a frozen string error in lib/gitlab/utils.rb. !23690
|
||||
- Fix MR resolved discussion counts being too low. !23710
|
||||
- Fix a potential frozen string error in app/mailers/notify.rb. !23728
|
||||
- Remove unnecessary div from MarkdownField to apply list styles correctly. !23733
|
||||
- Display reply field if resolved discussion has no replies. !23801
|
||||
- Restore kubernetes:active in Auto-DevOps.gitlab-ci.yml (reverts 22929). !23826
|
||||
- Fix mergeUrlParams with fragment URL. !54218 (Thomas Holder)
|
||||
- Fixed multiple diff line discussions not expanding.
|
||||
- Fixed diff files expanding not loading commit content.
|
||||
- Fixed styling of image comment badges on commits.
|
||||
- Resolve possible cherry pick API race condition.
|
||||
- When user clicks linenumber in MR changes, highlight that line.
|
||||
- Remove old webhook logs after 90 days, as documented, instead of after 2.
|
||||
- Add an external IP address to the knative cluster application page. (Chris Baumbauer)
|
||||
- Fixed duplicate discussions getting added to diff lines.
|
||||
- Fix deadlock on ChunkedIO.
|
||||
- Show tree collapse button for merge request commit diffs.
|
||||
- Use approximate count for big tables for usage statistics.
|
||||
- Lock writes to trace stream.
|
||||
- Ensure that SVG sprite icons are properly rendered in IE11.
|
||||
- Make new branch form fields' fonts consistent.
|
||||
- Open first 10 merge request files in IDE.
|
||||
- Prevent user from navigating away from file edit without commit.
|
||||
- Prevent empty button being rendered in empty state.
|
||||
- Adds margins between tags when a job is stuck.
|
||||
- Fix Image Lazy Loader for some older browsers.
|
||||
- Correctly styles tags in sidebar for job page.
|
||||
|
||||
### Changed (34 changes, 9 of them are from the community)
|
||||
|
||||
- Include new link in breadcrumb for issues, merge requests, milestones, and labels. !18515 (George Tsiolis)
|
||||
- Allow sorting issues and MRs in reverse order. !21438
|
||||
- Design improvements to project overview page. !22196
|
||||
- Remove auto deactivation when failed to create a pipeline via pipeline schedules. !22243
|
||||
- Use group clusters when deploying (DeploymentPlatform). !22308
|
||||
- Improve initial discussion rendering performance. !22607
|
||||
- removes partially matching of No Label filter and makes it case-insensitive. !22622 (Jacopo Beschi @jacopo-beschi)
|
||||
- Use search bar for filtering in dashboard issues / MRs. !22641 (Heinrich Lee Yu)
|
||||
- Show different empty state for filtered issues and MRs. !22775 (Heinrich Lee Yu)
|
||||
- Relocate JSONWebToken::HMACToken from EE. !22906
|
||||
- Resolve Add border around the repository file tree. !23018
|
||||
- Change breadcrumb title for contribution charts. !23071 (George Tsiolis)
|
||||
- Update environments metrics empty state. !23074 (George Tsiolis)
|
||||
- Refine cursor positioning in Markdown Editor for wrap tags. !23085 (Johann Hubert Sonntagbauer)
|
||||
- Use reports syntax for SAST in Auto DevOps. !23163
|
||||
- SystemCheck: Use a more reliable way to detect current Ruby version. !23291
|
||||
- Changed frontmatter filtering to support YAML, JSON, TOML, and arbitrary languages. !23331 (Travis Miller)
|
||||
- Don't remove failed install pods after installing GitLab managed applications. !23350
|
||||
- Expose merge request pipeline variables. !23398
|
||||
- Scope default MR search in WebIDE dropdown to current project. !23400
|
||||
- Show user contributions in correct timezone within user profile. !23419
|
||||
- Redesign of MR header sections (CE). !23465
|
||||
- Auto DevOps: Add echo for each branch of the deploy() function where we run helm upgrade. !23499
|
||||
- Updates service to update Kubernetes project namespaces and restricted service account if present. !23525
|
||||
- Adjust divider margin to comply with design specs. !23548
|
||||
- Adjust dropdown item and header padding to comply with design specs. !23552
|
||||
- Truncate merge request titles with periods instead of ellipsis. !23558
|
||||
- Remove close icon from projects dropdown in issue boards. !23567
|
||||
- Change dropdown divider color to gray-200 (#dfdfdf). !23592
|
||||
- Define the default value for only/except policies. !23765
|
||||
- Don't show Memory Usage for unmerged MRs.
|
||||
- reorder notification settings by noisy-ness. (C.J. Jameson)
|
||||
- Changed merge request filtering to be by path instead of name.
|
||||
- Make diff file headers sticky.
|
||||
|
||||
### Performance (22 changes, 6 of them are from the community)
|
||||
|
||||
- Upgrade to Ruby 2.5.3. !2806
|
||||
- Removes all the irrelevant code and columns that were migrated from the Project table over to the ProjectImportState table. !21497
|
||||
- Approximate counting strategy with TABLESAMPLE. !22650
|
||||
- Replace tooltip directive with gl-tooltip diretive in badges, cycle analytics, and diffs. !22770 (George Tsiolis)
|
||||
- Validate foreign keys being created and indexed for column with _id. !22808
|
||||
- Remove monospace extend. !23089 (George Tsiolis)
|
||||
- Use Nokogiri as the ActiveSupport XML backend. !23136
|
||||
- Improve memory performance by reducing dirty pages after fork(). !23169
|
||||
- Add partial index for ci_builds on project_id and status. !23268
|
||||
- Reduce Gitaly calls in projects dashboard. !23307
|
||||
- Batch load only data from same repository when lazy object is accessed. !23309
|
||||
- Add index for events on project_id and created_at. !23354
|
||||
- Remove index for notes on updated_at. !23356
|
||||
- Improves performance of Project#readme_url by caching the README path. !23357
|
||||
- Populate MR metrics with events table information (migration). !23564
|
||||
- Remove unused data from discussions endpoint. !23570
|
||||
- Speed up issue board lists in groups with many projects.
|
||||
- Use cached size when passing artifacts to Runner.
|
||||
- Enable even more frozen string for lib/gitlab. (gfyoung)
|
||||
- Enable even more frozen string in lib/gitlab/**/*.rb. (gfyoung)
|
||||
- Enable even more frozen string in lib/gitlab/**/*.rb. (gfyoung)
|
||||
- Enable even more frozen string for lib/gitlab. (gfyoung)
|
||||
|
||||
### Added (32 changes, 13 of them are from the community)
|
||||
|
||||
- Add ability to create group level clusters and install gitlab managed applications. !22450
|
||||
- Creates /create_merge_request quickaction. !22485 (Jacopo Beschi @jacopo-beschi)
|
||||
- Filter by None/Any for labels in issues/mrs API. !22622 (Jacopo Beschi @jacopo-beschi)
|
||||
- Chat message push notifications now include links back to GitLab branches. !22651 (Tony Castrogiovanni)
|
||||
- Added feature flag to signal content headers detection by Workhorse. !22667
|
||||
- Add Discord integration. !22684 (@blackst0ne)
|
||||
- Upgrade helm to 2.11.0 and upgrade on every install. !22693
|
||||
- Add knative client to kubeclient library. !22968 (cab105)
|
||||
- Allow SSH public-key authentication for push mirroring. !22982
|
||||
- Allow deleting a Pipeline via the API. !22988
|
||||
- #40635: Adds support for cert-manager. !23036 (Amit Rathi)
|
||||
- WebIDE: Pressing Ctrl-Enter while typing on the commit message now performs the commit action. !23049 (Thomas Pathier)
|
||||
- Adds Any option to label filters. !23111 (Jacopo Beschi @jacopo-beschi)
|
||||
- Added glob for CI changes detection. !23128 (Kirill Zaitsev)
|
||||
- Add model and relation to store repo full path in database. !23143
|
||||
- Add ability to render suggestions. !23147
|
||||
- Introduce Knative and Serverless Components. !23174 (Chris Baumbauer)
|
||||
- Use BFG object maps to clean projects. !23189
|
||||
- Merge request pipelines. !23217
|
||||
- Extended user centric tooltips on issue and MR page. !23231
|
||||
- Add a rebase API endpoint for merge requests. !23296
|
||||
- Add config to prohibit impersonation. !23338
|
||||
- Merge request pipeline tag, and adds tags to pipeline view. !23364
|
||||
- #52753: HTTPS for JupyterHub installation. !23479 (Amit Rathi)
|
||||
- Fill project_repositories for hashed storage projects. !23482
|
||||
- Ability to override email for cert-manager. !23503 (Amit Rathi)
|
||||
- Allow public forks to be deduplicated. !23508
|
||||
- Pipeline trigger variable values are hidden in the UI by default. Maintainers have the option to reveal them. !23518 (jhampton)
|
||||
- Add new endpoint to download single artifact file for a ref. !23538
|
||||
- Log and pass correlation-id between Unicorn, Sidekiq and Gitaly.
|
||||
- Allow user to scroll to top of tab on MR page.
|
||||
- Adds states to the deployment widget.
|
||||
|
||||
### Other (54 changes, 30 of them are from the community)
|
||||
|
||||
- Switch to Rails 5. !21492
|
||||
- Migration to write fullpath in all repository configs. !22322
|
||||
- Rails5: env is deprecated and will be removed from Rails 5.1. !22626 (Jasper Maes)
|
||||
- Update haml_lint to 0.28.0. !22660 (Takuya Noguchi)
|
||||
- Update ffaker to 2.10.0. !22661 (Takuya Noguchi)
|
||||
- Drop gcp_clusters table. !22713
|
||||
- Upgrade minimum required Git version to 2.18.0. !22803
|
||||
- Adds new icon size to Vue icon component. !22899
|
||||
- Make sure there's only one slash as path separator. !22954
|
||||
- Show HTTP response code for Kubernetes errors. !22964
|
||||
- Update config map for gitlab managed application if already present on install. !22969
|
||||
- Drop default value on status column in deployments table. !22971
|
||||
- UI improvements to user's profile. !22977
|
||||
- Update asana to 0.8.1. !23039 (Takuya Noguchi)
|
||||
- Update asciidoctor to 1.5.8. !23047 (Takuya Noguchi)
|
||||
- Make auto-generated icons for subgroups in the breadcrumb dropdown display as a circle. !23062 (Thomas Pathier)
|
||||
- Make reply shortcut only quote selected discussion text. !23096 (Thomas Pathier)
|
||||
- Fix typo in notebook props. !23103 (George Tsiolis)
|
||||
- Fix typos in lib. !23106 (George Tsiolis)
|
||||
- Rename diffs store variable. !23123 (George Tsiolis)
|
||||
- Fix overlapping navbar separator and overflowing navbar dropdown on small displays. !23126 (Thomas Pathier)
|
||||
- Show what RPC is called in the performance bar. !23140
|
||||
- Updated Gitaly to v0.133.0. !23148
|
||||
- Rails5: Passing a class as a value in an Active Record query is deprecated. !23164 (Jasper Maes)
|
||||
- Fix project identicon aligning Harry Kiselev. !23166 (Harry Kiselev)
|
||||
- Fix horizontal scrollbar overlapping on horizontal scrolling-tabs. !23167 (Harry Kiselev)
|
||||
- Fix bottom paddings of profile header and some markup updates of profile. !23168 (Harry Kiselev)
|
||||
- Fixes to AWS documentation spelling and grammar. !23198 (Brendan O'Leary)
|
||||
- Adds a PHILOSOPHY.md which references GitLab Product Handbook. !23200
|
||||
- Externalize strings from `/app/views/invites`. !23205 (Tao Wang)
|
||||
- Externalize strings from `/app/views/project/runners`. !23208 (Tao Wang)
|
||||
- Fix typo for scheduled pipeline. !23218 (Davy Defaud)
|
||||
- Force content disposition attachment to several endpoints. !23223
|
||||
- Upgrade kubeclient to 4.0.0. !23261 (Praveen Arimbrathodiyil @pravi)
|
||||
- Update used version of Runner Helm Chart to 0.1.38. !23304
|
||||
- render :nothing option is deprecated, Use head method to respond with empty response body. !23311 (Jasper Maes)
|
||||
- Passing an argument to force an association to reload is now deprecated. !23334 (Jasper Maes)
|
||||
- Externalize strings from `/app/views/snippets`. !23351 (Tao Wang)
|
||||
- Fix deprecation: You are passing an instance of ActiveRecord::Base to. !23369 (Jasper Maes)
|
||||
- Resolve status emoji being replaced by avatar on mobile. !23408
|
||||
- Fix deprecation: render :text is deprecated because it does not actually render a text/plain response. !23425 (Jasper Maes)
|
||||
- Fix lack of documentation on how to fetch a snippet's content using API. !23448 (Colin Leroy)
|
||||
- Upgrade GitLab Workhorse to v7.3.0. !23489
|
||||
- Fallback to admin KUBE_TOKEN for project clusters only. !23527
|
||||
- Update used version of Runner Helm Chart to 0.1.39. !23633
|
||||
- Show primary button when all labels are prioritized. !23648 (George Tsiolis)
|
||||
- Upgrade workhorse to 7.6.0. !23694
|
||||
- Upgrade Gitaly to v1.7.1 for correlation-id logging. !23732
|
||||
- Fix due date test. !23845
|
||||
- Remove unused project method. !54103 (George Tsiolis)
|
||||
- Uses new gitlab-ui components in Jobs and Pipelines components.
|
||||
- Replaces tooltip directive with the new gl-tooltip directive for consistency in some ci/cd code.
|
||||
- Bump gpgme gem version from 2.0.13 to 2.0.18. (asaparov)
|
||||
- Enable Rubocop on lib/gitlab. (gfyoung)
|
||||
|
||||
|
||||
## 11.5.3 (2018-12-06)
|
||||
|
@ -324,6 +587,55 @@ entry.
|
|||
- Disables stop environment button while the deploy is in progress.
|
||||
|
||||
|
||||
## 11.4.9 (2018-12-03)
|
||||
|
||||
### Fixed (2 changes)
|
||||
|
||||
- Display impersonation token value only after creation. !22916
|
||||
- Correctly handle data-loss scenarios when encrypting columns. !23306
|
||||
|
||||
|
||||
## 11.4.8 (2018-11-27)
|
||||
|
||||
### Security (24 changes)
|
||||
|
||||
- Escape entity title while autocomplete template rendering to prevent XSS. !2571
|
||||
- Resolve reflected XSS in Ouath authorize window.
|
||||
- Fix XSS in merge request source branch name.
|
||||
- Escape user fullname while rendering autocomplete template to prevent XSS.
|
||||
- Fix CRLF vulnerability in Project hooks.
|
||||
- Fix possible XSS attack in Markdown urls with spaces.
|
||||
- Redact sensitive information on gitlab-workhorse log.
|
||||
- Do not follow redirects in Prometheus service when making http requests to the configured api url.
|
||||
- Persist only SHA digest of PersonalAccessToken#token.
|
||||
- Don't expose confidential information in commit message list.
|
||||
- Provide email notification when a user changes their email address.
|
||||
- Restrict Personal Access Tokens to API scope on web requests.
|
||||
- Redact personal tokens in unsubscribe links.
|
||||
- Fix SSRF in project integrations.
|
||||
- Fixed ability to comment on locked/confidential issues.
|
||||
- Fixed ability of guest users to edit/delete comments on locked or confidential issues.
|
||||
- Fix milestone promotion authorization check.
|
||||
- Monkey kubeclient to not follow any redirects.
|
||||
- Configure mermaid to not render HTML content in diagrams.
|
||||
- Fix a possible symlink time of check to time of use race condition in GitLab Pages.
|
||||
- Removed ability to see private group names when the group id is entered in the url.
|
||||
- Fix stored XSS for Environments.
|
||||
- Prevent SSRF attacks in HipChat integration.
|
||||
- Validate Wiki attachments are valid temporary files.
|
||||
|
||||
|
||||
## 11.4.7 (2018-11-20)
|
||||
|
||||
- No changes.
|
||||
|
||||
## 11.4.6 (2018-11-18)
|
||||
|
||||
### Security (1 change)
|
||||
|
||||
- Escape user fullname while rendering autocomplete template to prevent XSS.
|
||||
|
||||
|
||||
## 11.4.5 (2018-11-04)
|
||||
|
||||
### Fixed (4 changes, 1 of them is from the community)
|
||||
|
@ -593,6 +905,59 @@ entry.
|
|||
- Check frozen string in style builds. (gfyoung)
|
||||
|
||||
|
||||
## 11.3.12 (2018-12-06)
|
||||
|
||||
### Security (1 change)
|
||||
|
||||
- Prevent a path traversal attack on global file templates.
|
||||
|
||||
|
||||
## 11.3.11 (2018-11-26)
|
||||
|
||||
### Security (33 changes)
|
||||
|
||||
- Filter user sensitive data from discussions JSON. !2537
|
||||
- Escape entity title while autocomplete template rendering to prevent XSS. !2557
|
||||
- Restrict Personal Access Tokens to API scope on web requests.
|
||||
- Fix XSS in merge request source branch name.
|
||||
- Escape user fullname while rendering autocomplete template to prevent XSS.
|
||||
- Fix CRLF vulnerability in Project hooks.
|
||||
- Fix possible XSS attack in Markdown urls with spaces.
|
||||
- Redact sensitive information on gitlab-workhorse log.
|
||||
- Set timeout for syntax highlighting.
|
||||
- Do not follow redirects in Prometheus service when making http requests to the configured api url.
|
||||
- Persist only SHA digest of PersonalAccessToken#token.
|
||||
- Sanitize JSON data properly to fix XSS on Issue details page.
|
||||
- Don't expose confidential information in commit message list.
|
||||
- Markdown API no longer displays confidential title references unless authorized.
|
||||
- Provide email notification when a user changes their email address.
|
||||
- Properly filter private references from system notes.
|
||||
- Redact personal tokens in unsubscribe links.
|
||||
- Resolve reflected XSS in Ouath authorize window.
|
||||
- Fix SSRF in project integrations.
|
||||
- Fix stored XSS in merge requests from imported repository.
|
||||
- Fixed ability to comment on locked/confidential issues.
|
||||
- Fixed ability of guest users to edit/delete comments on locked or confidential issues.
|
||||
- Fix milestone promotion authorization check.
|
||||
- Monkey kubeclient to not follow any redirects.
|
||||
- Configure mermaid to not render HTML content in diagrams.
|
||||
- Redact confidential events in the API.
|
||||
- Fix xss vulnerability sourced from package.json.
|
||||
- Fix a possible symlink time of check to time of use race condition in GitLab Pages.
|
||||
- Removed ability to see private group names when the group id is entered in the url.
|
||||
- Fix stored XSS for Environments.
|
||||
- Block loopback addresses in UrlBlocker.
|
||||
- Prevent SSRF attacks in HipChat integration.
|
||||
- Validate Wiki attachments are valid temporary files.
|
||||
|
||||
|
||||
## 11.3.10 (2018-11-18)
|
||||
|
||||
### Security (1 change)
|
||||
|
||||
- Escape user fullname while rendering autocomplete template to prevent XSS.
|
||||
|
||||
|
||||
## 11.3.9 (2018-10-31)
|
||||
|
||||
### Security (1 change)
|
||||
|
|
|
@ -181,4 +181,4 @@ This [documentation](doc/development/contributing/merge_request_workflow.md) has
|
|||
|
||||
## Style guides
|
||||
|
||||
This [documentation](doc/development/contributing/design.md) has been moved.
|
||||
This [documentation](doc/development/contributing/style_guides.md) has been moved.
|
||||
|
|
|
@ -1 +1 @@
|
|||
0.129.0
|
||||
1.7.1
|
||||
|
|
|
@ -1 +1 @@
|
|||
8.4.1
|
||||
8.4.3
|
||||
|
|
|
@ -1 +1 @@
|
|||
7.1.3
|
||||
7.6.0
|
||||
|
|
61
Gemfile
61
Gemfile
|
@ -1,13 +1,17 @@
|
|||
# --- Special code for migrating to Rails 5.0 ---
|
||||
def rails5?
|
||||
%w[1 true].include?(ENV["RAILS5"])
|
||||
!%w[0 false].include?(ENV["RAILS5"])
|
||||
end
|
||||
|
||||
gem_versions = {}
|
||||
gem_versions['activerecord_sane_schema_dumper'] = rails5? ? '1.0' : '0.2'
|
||||
gem_versions['default_value_for'] = rails5? ? '~> 3.0.5' : '~> 3.0.0'
|
||||
gem_versions['rails'] = rails5? ? '5.0.7' : '4.2.10'
|
||||
gem_versions['rails-i18n'] = rails5? ? '~> 5.1' : '~> 4.0.9'
|
||||
gem_versions['activerecord_sane_schema_dumper'] = rails5? ? '1.0' : '0.2'
|
||||
gem_versions['rails'] = rails5? ? '5.0.7' : '4.2.11'
|
||||
gem_versions['rails-i18n'] = rails5? ? '~> 5.1' : '~> 4.0.9'
|
||||
|
||||
# The 2.0.6 version of rack requires monkeypatch to be present in
|
||||
# `config.ru`. This can be removed once a new update for Rack
|
||||
# is available that contains https://github.com/rack/rack/pull/1201.
|
||||
gem_versions['rack'] = rails5? ? '2.0.6' : '1.6.11'
|
||||
# --- The end of special code for migrating to Rails 5.0 ---
|
||||
|
||||
source 'https://rubygems.org'
|
||||
|
@ -15,13 +19,20 @@ source 'https://rubygems.org'
|
|||
gem 'rails', gem_versions['rails']
|
||||
gem 'rails-deprecated_sanitizer', '~> 1.0.3'
|
||||
|
||||
# Improves copy-on-write performance for MRI
|
||||
gem 'nakayoshi_fork', '~> 0.0.4'
|
||||
|
||||
# Responders respond_to and respond_with
|
||||
gem 'responders', '~> 2.0'
|
||||
|
||||
gem 'sprockets', '~> 3.7.0'
|
||||
|
||||
# Default values for AR models
|
||||
gem 'default_value_for', gem_versions['default_value_for']
|
||||
if rails5?
|
||||
gem 'gitlab-default_value_for', '~> 3.1.1', require: 'default_value_for'
|
||||
else
|
||||
gem 'default_value_for', '~> 3.0.0'
|
||||
end
|
||||
|
||||
# Supported DBs
|
||||
gem 'mysql2', '~> 0.4.10', group: :mysql
|
||||
|
@ -71,7 +82,7 @@ gem 'validates_hostname', '~> 1.0.6'
|
|||
gem 'browser', '~> 2.5'
|
||||
|
||||
# GPG
|
||||
gem 'gpgme'
|
||||
gem 'gpgme', '~> 2.0.18'
|
||||
|
||||
# LDAP Auth
|
||||
# GitLab fork with several improvements to original library. For full list of changes
|
||||
|
@ -80,7 +91,7 @@ gem 'gitlab_omniauth-ldap', '~> 2.0.4', require: 'omniauth-ldap'
|
|||
gem 'net-ldap'
|
||||
|
||||
# API
|
||||
gem 'grape', '~> 1.1'
|
||||
gem 'grape', '~> 1.1.0'
|
||||
gem 'grape-entity', '~> 0.7.1'
|
||||
gem 'rack-cors', '~> 1.0.0', require: 'rack/cors'
|
||||
|
||||
|
@ -124,7 +135,7 @@ gem 'seed-fu', '~> 2.3.7'
|
|||
# Markdown and HTML processing
|
||||
gem 'html-pipeline', '~> 2.8'
|
||||
gem 'deckar01-task_list', '2.0.0'
|
||||
gem 'gitlab-markup', '~> 1.6.4'
|
||||
gem 'gitlab-markup', '~> 1.6.5'
|
||||
gem 'github-markup', '~> 1.7.0', require: 'github/markup'
|
||||
gem 'redcarpet', '~> 3.4'
|
||||
gem 'commonmarker', '~> 0.17'
|
||||
|
@ -133,7 +144,7 @@ gem 'rdoc', '~> 6.0'
|
|||
gem 'org-ruby', '~> 0.9.12'
|
||||
gem 'creole', '~> 0.5.0'
|
||||
gem 'wikicloth', '0.8.1'
|
||||
gem 'asciidoctor', '~> 1.5.6'
|
||||
gem 'asciidoctor', '~> 1.5.8'
|
||||
gem 'asciidoctor-plantuml', '0.0.8'
|
||||
gem 'rouge', '~> 3.1'
|
||||
gem 'truncato', '~> 0.7.9'
|
||||
|
@ -148,6 +159,8 @@ gem 'icalendar'
|
|||
gem 'diffy', '~> 3.1.0'
|
||||
|
||||
# Application server
|
||||
gem 'rack', gem_versions['rack']
|
||||
|
||||
group :unicorn do
|
||||
gem 'unicorn', '~> 5.1.0'
|
||||
gem 'unicorn-worker-killer', '~> 0.4.4'
|
||||
|
@ -168,6 +181,7 @@ gem 'acts-as-taggable-on', '~> 5.0'
|
|||
gem 'sidekiq', '~> 5.2.1'
|
||||
gem 'sidekiq-cron', '~> 0.6.0'
|
||||
gem 'redis-namespace', '~> 1.6.0'
|
||||
gem 'gitlab-sidekiq-fetcher', '~> 0.1.0', require: 'sidekiq-reliable-fetch'
|
||||
|
||||
# Cron Parser
|
||||
gem 'rufus-scheduler', '~> 3.4'
|
||||
|
@ -204,6 +218,9 @@ gem 'redis-rails', '~> 5.0.2'
|
|||
gem 'redis', '~> 3.2'
|
||||
gem 'connection_pool', '~> 2.0'
|
||||
|
||||
# Discord integration
|
||||
gem 'discordrb-webhooks-blackst0ne', '~> 3.3', require: false
|
||||
|
||||
# HipChat integration
|
||||
gem 'hipchat', '~> 1.5.0'
|
||||
|
||||
|
@ -220,13 +237,13 @@ gem 'slack-notifier', '~> 1.5.1'
|
|||
gem 'hangouts-chat', '~> 0.0.5'
|
||||
|
||||
# Asana integration
|
||||
gem 'asana', '~> 0.6.0'
|
||||
gem 'asana', '~> 0.8.1'
|
||||
|
||||
# FogBugz integration
|
||||
gem 'ruby-fogbugz', '~> 0.2.1'
|
||||
|
||||
# Kubernetes integration
|
||||
gem 'kubeclient', '~> 3.1.0'
|
||||
gem 'kubeclient', '~> 4.0.0'
|
||||
|
||||
# Sanitize user input
|
||||
gem 'sanitize', '~> 4.6'
|
||||
|
@ -247,6 +264,9 @@ gem 'ace-rails-ap', '~> 4.1.0'
|
|||
# Detect and convert string character encoding
|
||||
gem 'charlock_holmes', '~> 0.7.5'
|
||||
|
||||
# Detect mime content type from content
|
||||
gem 'mimemagic', '~> 0.3.2'
|
||||
|
||||
# Faster blank
|
||||
gem 'fast_blank'
|
||||
|
||||
|
@ -282,7 +302,7 @@ gem 'gettext_i18n_rails', '~> 1.8.0'
|
|||
gem 'gettext_i18n_rails_js', '~> 1.3'
|
||||
gem 'gettext', '~> 3.2.2', require: false, group: :development
|
||||
|
||||
gem 'batch-loader', '~> 1.2.1'
|
||||
gem 'batch-loader', '~> 1.2.2'
|
||||
|
||||
# Perf bar
|
||||
gem 'peek', '~> 1.0.1'
|
||||
|
@ -291,7 +311,6 @@ gem 'peek-mysql2', '~> 1.1.0', group: :mysql
|
|||
gem 'peek-pg', '~> 1.3.0', group: :postgres
|
||||
gem 'peek-rblineprof', '~> 0.2.0'
|
||||
gem 'peek-redis', '~> 1.2.0'
|
||||
gem 'gitlab-sidekiq-fetcher', require: 'sidekiq-reliable-fetch'
|
||||
|
||||
# Metrics
|
||||
group :metrics do
|
||||
|
@ -311,8 +330,8 @@ group :development do
|
|||
gem 'rblineprof', '~> 0.3.6', platform: :mri, require: false
|
||||
|
||||
# Better errors handler
|
||||
gem 'better_errors', '~> 2.1.0'
|
||||
gem 'binding_of_caller', '~> 0.7.2'
|
||||
gem 'better_errors', '~> 2.5.0'
|
||||
gem 'binding_of_caller', '~> 0.8.0'
|
||||
|
||||
# thin instead webrick
|
||||
gem 'thin', '~> 1.7.0'
|
||||
|
@ -339,7 +358,7 @@ group :development, :test do
|
|||
gem 'minitest', '~> 5.7.0'
|
||||
|
||||
# Generate Fake data
|
||||
gem 'ffaker', '~> 2.4'
|
||||
gem 'ffaker', '~> 2.10'
|
||||
|
||||
gem 'capybara', '~> 2.15'
|
||||
gem 'capybara-screenshot', '~> 1.0.0'
|
||||
|
@ -354,14 +373,14 @@ group :development, :test do
|
|||
gem 'rubocop-rspec', '~> 1.22.1'
|
||||
|
||||
gem 'scss_lint', '~> 0.56.0', require: false
|
||||
gem 'haml_lint', '~> 0.26.0', require: false
|
||||
gem 'haml_lint', '~> 0.28.0', require: false
|
||||
gem 'simplecov', '~> 0.14.0', require: false
|
||||
gem 'bundler-audit', '~> 0.5.0', require: false
|
||||
|
||||
gem 'benchmark-ips', '~> 2.3.0', require: false
|
||||
|
||||
gem 'license_finder', '~> 5.4', require: false
|
||||
gem 'knapsack', '~> 1.16'
|
||||
gem 'knapsack', '~> 1.17'
|
||||
|
||||
gem 'activerecord_sane_schema_dumper', gem_versions['activerecord_sane_schema_dumper']
|
||||
|
||||
|
@ -380,7 +399,7 @@ group :test do
|
|||
gem 'rails-controller-testing' if rails5? # Rails5 only gem.
|
||||
gem 'test_after_commit', '~> 1.1' unless rails5? # Remove this gem when migrated to rails 5.0. It's been integrated to rails 5.0.
|
||||
gem 'sham_rack', '~> 1.3.6'
|
||||
gem 'concurrent-ruby', '~> 1.0.5'
|
||||
gem 'concurrent-ruby', '~> 1.1'
|
||||
gem 'test-prof', '~> 0.2.5'
|
||||
gem 'rspec_junit_formatter'
|
||||
end
|
||||
|
@ -416,7 +435,7 @@ group :ed25519 do
|
|||
end
|
||||
|
||||
# Gitaly GRPC client
|
||||
gem 'gitaly-proto', '~> 0.123.0', require: 'gitaly'
|
||||
gem 'gitaly-proto', '~> 1.3.0', require: 'gitaly'
|
||||
gem 'grpc', '~> 1.15.0'
|
||||
|
||||
gem 'google-protobuf', '~> 3.6'
|
||||
|
|
258
Gemfile.lock
258
Gemfile.lock
|
@ -4,41 +4,44 @@ GEM
|
|||
RedCloth (4.3.2)
|
||||
abstract_type (0.0.7)
|
||||
ace-rails-ap (4.1.2)
|
||||
actionmailer (4.2.10)
|
||||
actionpack (= 4.2.10)
|
||||
actionview (= 4.2.10)
|
||||
activejob (= 4.2.10)
|
||||
actioncable (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
nio4r (>= 1.2, < 3.0)
|
||||
websocket-driver (~> 0.6.1)
|
||||
actionmailer (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activejob (= 5.0.7)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.10)
|
||||
actionview (= 4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
rack (~> 2.0)
|
||||
rack-test (~> 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
actionview (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||
activejob (4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
globalid (>= 0.3.0)
|
||||
activemodel (4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.10)
|
||||
activemodel (= 4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
arel (~> 6.0)
|
||||
activerecord_sane_schema_dumper (0.2)
|
||||
rails (>= 4, < 5)
|
||||
activesupport (4.2.10)
|
||||
i18n (~> 0.7)
|
||||
activejob (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
activerecord (5.0.7)
|
||||
activemodel (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
arel (~> 7.0)
|
||||
activerecord_sane_schema_dumper (1.0)
|
||||
rails (>= 5, < 6)
|
||||
activesupport (5.0.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
acts-as-taggable-on (5.0.0)
|
||||
activerecord (>= 4.2.8)
|
||||
|
@ -49,13 +52,13 @@ GEM
|
|||
public_suffix (>= 2.0.2, < 4.0)
|
||||
aes_key_wrap (1.0.1)
|
||||
akismet (2.0.0)
|
||||
arel (6.0.4)
|
||||
asana (0.6.0)
|
||||
arel (7.1.4)
|
||||
asana (0.8.1)
|
||||
faraday (~> 0.9)
|
||||
faraday_middleware (~> 0.9)
|
||||
faraday_middleware-multi_json (~> 0.0)
|
||||
oauth2 (~> 1.0)
|
||||
asciidoctor (1.5.6.2)
|
||||
asciidoctor (1.5.8)
|
||||
asciidoctor-plantuml (0.0.8)
|
||||
asciidoctor (~> 1.5)
|
||||
ast (2.4.0)
|
||||
|
@ -70,16 +73,17 @@ GEM
|
|||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
babosa (1.0.2)
|
||||
base32 (0.3.2)
|
||||
batch-loader (1.2.1)
|
||||
batch-loader (1.2.2)
|
||||
bcrypt (3.1.12)
|
||||
bcrypt_pbkdf (1.0.0)
|
||||
benchmark-ips (2.3.0)
|
||||
better_errors (2.1.1)
|
||||
better_errors (2.5.0)
|
||||
coderay (>= 1.0.0)
|
||||
erubis (>= 2.6.6)
|
||||
erubi (>= 1.0.0)
|
||||
rack (>= 0.9.0)
|
||||
bindata (2.4.3)
|
||||
binding_of_caller (0.7.2)
|
||||
binding_ninja (0.2.2)
|
||||
binding_of_caller (0.8.0)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bootsnap (1.3.2)
|
||||
msgpack (~> 1.0)
|
||||
|
@ -125,9 +129,9 @@ GEM
|
|||
concord (0.1.5)
|
||||
adamantium (~> 0.2.0)
|
||||
equalizer (~> 0.0.9)
|
||||
concurrent-ruby (1.0.5)
|
||||
concurrent-ruby-ext (1.0.5)
|
||||
concurrent-ruby (= 1.0.5)
|
||||
concurrent-ruby (1.1.3)
|
||||
concurrent-ruby-ext (1.1.3)
|
||||
concurrent-ruby (= 1.1.3)
|
||||
connection_pool (2.2.2)
|
||||
crack (0.4.3)
|
||||
safe_yaml (~> 1.0.0)
|
||||
|
@ -137,14 +141,12 @@ GEM
|
|||
addressable
|
||||
daemons (1.2.6)
|
||||
database_cleaner (1.5.3)
|
||||
debug_inspector (0.0.2)
|
||||
debug_inspector (0.0.3)
|
||||
debugger-ruby_core_source (1.3.8)
|
||||
deckar01-task_list (2.0.0)
|
||||
html-pipeline
|
||||
declarative (0.0.10)
|
||||
declarative-option (0.1.0)
|
||||
default_value_for (3.0.2)
|
||||
activerecord (>= 3.2.0, < 5.1)
|
||||
descendants_tracker (0.0.4)
|
||||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
device_detector (1.0.0)
|
||||
|
@ -162,6 +164,8 @@ GEM
|
|||
rotp (~> 2.0)
|
||||
diff-lcs (1.3)
|
||||
diffy (3.1.0)
|
||||
discordrb-webhooks-blackst0ne (3.3.0)
|
||||
rest-client (~> 2.0)
|
||||
docile (1.1.5)
|
||||
domain_name (0.5.20180417)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
|
@ -178,8 +182,9 @@ GEM
|
|||
mail (~> 2.7)
|
||||
encryptor (3.0.0)
|
||||
equalizer (0.0.11)
|
||||
erubi (1.7.1)
|
||||
erubis (2.7.0)
|
||||
escape_utils (1.1.1)
|
||||
escape_utils (1.2.1)
|
||||
et-orbi (1.0.3)
|
||||
tzinfo
|
||||
eventmachine (1.2.7)
|
||||
|
@ -200,7 +205,7 @@ GEM
|
|||
multi_json
|
||||
fast_blank (1.0.0)
|
||||
fast_gettext (1.6.0)
|
||||
ffaker (2.4.0)
|
||||
ffaker (2.10.0)
|
||||
ffi (1.9.25)
|
||||
flipper (0.13.0)
|
||||
flipper-active_record (0.13.0)
|
||||
|
@ -269,11 +274,13 @@ GEM
|
|||
gettext_i18n_rails (>= 0.7.1)
|
||||
po_to_json (>= 1.0.0)
|
||||
rails (>= 3.2.0)
|
||||
gitaly-proto (0.123.0)
|
||||
gitaly-proto (1.3.0)
|
||||
grpc (~> 1.0)
|
||||
github-markup (1.7.0)
|
||||
gitlab-markup (1.6.4)
|
||||
gitlab-sidekiq-fetcher (0.3.0)
|
||||
gitlab-default_value_for (3.1.1)
|
||||
activerecord (>= 3.2.0, < 6.0)
|
||||
gitlab-markup (1.6.5)
|
||||
gitlab-sidekiq-fetcher (0.1.0)
|
||||
sidekiq (~> 5)
|
||||
gitlab-styles (2.4.1)
|
||||
rubocop (~> 0.54.0)
|
||||
|
@ -307,8 +314,8 @@ GEM
|
|||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (~> 0.7)
|
||||
gpgme (2.0.13)
|
||||
mini_portile2 (~> 2.1)
|
||||
gpgme (2.0.18)
|
||||
mini_portile2 (~> 2.3)
|
||||
grape (1.1.0)
|
||||
activesupport
|
||||
builder
|
||||
|
@ -335,11 +342,11 @@ GEM
|
|||
haml (5.0.4)
|
||||
temple (>= 0.8.0)
|
||||
tilt
|
||||
haml_lint (0.26.0)
|
||||
haml_lint (0.28.0)
|
||||
haml (>= 4.0, < 5.1)
|
||||
rainbow
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.49.0)
|
||||
rubocop (>= 0.50.0)
|
||||
sysexits (~> 1.1)
|
||||
hamlit (2.8.8)
|
||||
temple (>= 0.8.0)
|
||||
|
@ -361,20 +368,20 @@ GEM
|
|||
html2text (0.2.0)
|
||||
nokogiri (~> 1.6)
|
||||
htmlentities (4.3.4)
|
||||
http (2.2.2)
|
||||
http (3.3.0)
|
||||
addressable (~> 2.3)
|
||||
http-cookie (~> 1.0)
|
||||
http-form_data (~> 1.0.1)
|
||||
http-form_data (~> 2.0)
|
||||
http_parser.rb (~> 0.6.0)
|
||||
http-cookie (1.0.3)
|
||||
domain_name (~> 0.5)
|
||||
http-form_data (1.0.3)
|
||||
http-form_data (2.1.1)
|
||||
http_parser.rb (0.6.0)
|
||||
httparty (0.13.7)
|
||||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpclient (2.8.3)
|
||||
i18n (0.9.5)
|
||||
i18n (1.1.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
icalendar (2.4.1)
|
||||
ice_nine (0.11.2)
|
||||
|
@ -410,10 +417,10 @@ GEM
|
|||
kaminari-core (= 1.0.1)
|
||||
kaminari-core (1.0.1)
|
||||
kgio (2.10.0)
|
||||
knapsack (1.16.0)
|
||||
knapsack (1.17.0)
|
||||
rake
|
||||
kubeclient (3.1.0)
|
||||
http (~> 2.2.2)
|
||||
kubeclient (4.0.0)
|
||||
http (~> 3.0)
|
||||
recursive-open-struct (~> 1.0, >= 1.0.4)
|
||||
rest-client (~> 2.0)
|
||||
launchy (2.4.3)
|
||||
|
@ -439,7 +446,7 @@ GEM
|
|||
activesupport (>= 4)
|
||||
railties (>= 4)
|
||||
request_store (~> 1.0)
|
||||
loofah (2.2.2)
|
||||
loofah (2.2.3)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.0)
|
||||
|
@ -448,11 +455,11 @@ GEM
|
|||
memoist (0.16.0)
|
||||
memoizable (0.4.2)
|
||||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
method_source (0.9.0)
|
||||
mime-types (3.1)
|
||||
method_source (0.9.2)
|
||||
mime-types (3.2.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mimemagic (0.3.0)
|
||||
mime-types-data (3.2018.0812)
|
||||
mimemagic (0.3.2)
|
||||
mini_magick (4.8.0)
|
||||
mini_mime (1.0.1)
|
||||
mini_portile2 (2.3.0)
|
||||
|
@ -465,10 +472,12 @@ GEM
|
|||
mustermann-grape (1.0.0)
|
||||
mustermann (~> 1.0.0)
|
||||
mysql2 (0.4.10)
|
||||
nakayoshi_fork (0.0.4)
|
||||
net-ldap (0.16.0)
|
||||
net-ssh (5.0.1)
|
||||
netrc (0.11.0)
|
||||
nokogiri (1.8.4)
|
||||
nio4r (2.3.1)
|
||||
nokogiri (1.8.5)
|
||||
mini_portile2 (~> 2.3.0)
|
||||
nokogumbo (1.5.0)
|
||||
nokogiri
|
||||
|
@ -596,7 +605,7 @@ GEM
|
|||
get_process_mem (~> 0.2)
|
||||
puma (>= 2.7, < 4)
|
||||
pyu-ruby-sasl (0.0.3.3)
|
||||
rack (1.6.10)
|
||||
rack (2.0.6)
|
||||
rack-accept (0.4.5)
|
||||
rack (>= 0.4)
|
||||
rack-attack (4.4.1)
|
||||
|
@ -608,37 +617,42 @@ GEM
|
|||
httpclient (>= 2.4)
|
||||
multi_json (>= 1.3.6)
|
||||
rack (>= 1.1)
|
||||
rack-protection (2.0.3)
|
||||
rack-protection (2.0.4)
|
||||
rack
|
||||
rack-proxy (0.6.0)
|
||||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.2.10)
|
||||
actionmailer (= 4.2.10)
|
||||
actionpack (= 4.2.10)
|
||||
actionview (= 4.2.10)
|
||||
activejob (= 4.2.10)
|
||||
activemodel (= 4.2.10)
|
||||
activerecord (= 4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.2.10)
|
||||
sprockets-rails
|
||||
rails (5.0.7)
|
||||
actioncable (= 5.0.7)
|
||||
actionmailer (= 5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activejob (= 5.0.7)
|
||||
activemodel (= 5.0.7)
|
||||
activerecord (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
bundler (>= 1.3.0)
|
||||
railties (= 5.0.7)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (1.0.2)
|
||||
actionpack (~> 5.x, >= 5.0.1)
|
||||
actionview (~> 5.x, >= 5.0.1)
|
||||
activesupport (~> 5.x)
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (1.0.9)
|
||||
activesupport (>= 4.2.0, < 5.0)
|
||||
nokogiri (~> 1.6)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-html-sanitizer (1.0.4)
|
||||
loofah (~> 2.2, >= 2.2.2)
|
||||
rails-i18n (4.0.9)
|
||||
i18n (~> 0.7)
|
||||
railties (~> 4.0)
|
||||
railties (4.2.10)
|
||||
actionpack (= 4.2.10)
|
||||
activesupport (= 4.2.10)
|
||||
rails-i18n (5.1.1)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 5.0, < 6)
|
||||
railties (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
method_source
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rainbow (3.0.0)
|
||||
|
@ -676,7 +690,7 @@ GEM
|
|||
redis-actionpack (>= 5.0, < 6)
|
||||
redis-activesupport (>= 5.0, < 6)
|
||||
redis-store (>= 1.2, < 2)
|
||||
redis-store (1.4.1)
|
||||
redis-store (1.6.0)
|
||||
redis (>= 2.2, < 5)
|
||||
regexp_parser (0.5.0)
|
||||
representable (3.0.4)
|
||||
|
@ -711,8 +725,8 @@ GEM
|
|||
rspec-mocks (3.7.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-parameterized (0.4.0)
|
||||
binding_of_caller
|
||||
rspec-parameterized (0.4.1)
|
||||
binding_ninja (>= 0.2.1)
|
||||
parser
|
||||
proc_to_ast
|
||||
rspec (>= 2.13, < 4)
|
||||
|
@ -729,8 +743,7 @@ GEM
|
|||
rspec-core
|
||||
rspec-set (0.1.3)
|
||||
rspec-support (3.7.1)
|
||||
rspec_junit_formatter (0.2.3)
|
||||
builder (< 4)
|
||||
rspec_junit_formatter (0.4.1)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rspec_profiling (0.0.5)
|
||||
activerecord
|
||||
|
@ -756,8 +769,8 @@ GEM
|
|||
ruby-progressbar (1.9.0)
|
||||
ruby-saml (1.7.2)
|
||||
nokogiri (>= 1.5.10)
|
||||
ruby_parser (3.9.0)
|
||||
sexp_processor (~> 4.1)
|
||||
ruby_parser (3.11.0)
|
||||
sexp_processor (~> 4.9)
|
||||
rubyntlm (0.6.2)
|
||||
rubypants (0.2.0)
|
||||
rubyzip (1.2.2)
|
||||
|
@ -794,15 +807,15 @@ GEM
|
|||
selenium-webdriver (3.12.0)
|
||||
childprocess (~> 0.5)
|
||||
rubyzip (~> 1.2)
|
||||
sentry-raven (2.7.2)
|
||||
sentry-raven (2.7.4)
|
||||
faraday (>= 0.7.6, < 1.0)
|
||||
settingslogic (2.0.9)
|
||||
sexp_processor (4.9.0)
|
||||
sexp_processor (4.11.0)
|
||||
sham_rack (1.3.6)
|
||||
rack
|
||||
shoulda-matchers (3.1.2)
|
||||
activesupport (>= 4.0.0)
|
||||
sidekiq (5.2.1)
|
||||
sidekiq (5.2.3)
|
||||
connection_pool (~> 2.2, >= 2.2.2)
|
||||
rack-protection (>= 1.5.0)
|
||||
redis (>= 3.3.5, < 5)
|
||||
|
@ -847,8 +860,6 @@ GEM
|
|||
sysexits (1.2.0)
|
||||
temple (0.8.0)
|
||||
test-prof (0.2.5)
|
||||
test_after_commit (1.1.0)
|
||||
activerecord (>= 3.2)
|
||||
text (1.3.1)
|
||||
thin (1.7.2)
|
||||
daemons (~> 1.0, >= 1.0.9)
|
||||
|
@ -885,7 +896,7 @@ GEM
|
|||
get_process_mem (~> 0)
|
||||
unicorn (>= 4, < 6)
|
||||
uniform_notifier (1.10.0)
|
||||
unparser (0.2.7)
|
||||
unparser (0.4.2)
|
||||
abstract_type (~> 0.0.7)
|
||||
adamantium (~> 0.2.0)
|
||||
concord (~> 0.1.5)
|
||||
|
@ -911,6 +922,9 @@ GEM
|
|||
hashdiff
|
||||
webpack-rails (0.9.11)
|
||||
railties (>= 3.2.0)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.3)
|
||||
wikicloth (0.8.1)
|
||||
builder
|
||||
expression_parser
|
||||
|
@ -926,22 +940,22 @@ PLATFORMS
|
|||
DEPENDENCIES
|
||||
RedCloth (~> 4.3.2)
|
||||
ace-rails-ap (~> 4.1.0)
|
||||
activerecord_sane_schema_dumper (= 0.2)
|
||||
activerecord_sane_schema_dumper (= 1.0)
|
||||
acts-as-taggable-on (~> 5.0)
|
||||
addressable (~> 2.5.2)
|
||||
akismet (~> 2.0)
|
||||
asana (~> 0.6.0)
|
||||
asciidoctor (~> 1.5.6)
|
||||
asana (~> 0.8.1)
|
||||
asciidoctor (~> 1.5.8)
|
||||
asciidoctor-plantuml (= 0.0.8)
|
||||
attr_encrypted (~> 3.1.0)
|
||||
awesome_print
|
||||
babosa (~> 1.0.2)
|
||||
base32 (~> 0.3.0)
|
||||
batch-loader (~> 1.2.1)
|
||||
batch-loader (~> 1.2.2)
|
||||
bcrypt_pbkdf (~> 1.0)
|
||||
benchmark-ips (~> 2.3.0)
|
||||
better_errors (~> 2.1.0)
|
||||
binding_of_caller (~> 0.7.2)
|
||||
better_errors (~> 2.5.0)
|
||||
binding_of_caller (~> 0.8.0)
|
||||
bootsnap (~> 1.3)
|
||||
bootstrap_form (~> 2.7.0)
|
||||
brakeman (~> 4.2)
|
||||
|
@ -955,16 +969,16 @@ DEPENDENCIES
|
|||
chronic (~> 0.10.2)
|
||||
chronic_duration (~> 0.10.6)
|
||||
commonmarker (~> 0.17)
|
||||
concurrent-ruby (~> 1.0.5)
|
||||
concurrent-ruby (~> 1.1)
|
||||
connection_pool (~> 2.0)
|
||||
creole (~> 0.5.0)
|
||||
database_cleaner (~> 1.5.0)
|
||||
deckar01-task_list (= 2.0.0)
|
||||
default_value_for (~> 3.0.0)
|
||||
device_detector
|
||||
devise (~> 4.4)
|
||||
devise-two-factor (~> 3.0.0)
|
||||
diffy (~> 3.1.0)
|
||||
discordrb-webhooks-blackst0ne (~> 3.3)
|
||||
doorkeeper (~> 4.3)
|
||||
doorkeeper-openid_connect (~> 1.5)
|
||||
ed25519 (~> 1.2)
|
||||
|
@ -974,7 +988,7 @@ DEPENDENCIES
|
|||
factory_bot_rails (~> 4.8.2)
|
||||
faraday (~> 0.12)
|
||||
fast_blank
|
||||
ffaker (~> 2.4)
|
||||
ffaker (~> 2.10)
|
||||
flipper (~> 0.13.0)
|
||||
flipper-active_record (~> 0.13.0)
|
||||
flipper-active_support_cache_store (~> 0.13.0)
|
||||
|
@ -993,24 +1007,25 @@ DEPENDENCIES
|
|||
gettext (~> 3.2.2)
|
||||
gettext_i18n_rails (~> 1.8.0)
|
||||
gettext_i18n_rails_js (~> 1.3)
|
||||
gitaly-proto (~> 0.123.0)
|
||||
gitaly-proto (~> 1.3.0)
|
||||
github-markup (~> 1.7.0)
|
||||
gitlab-markup (~> 1.6.4)
|
||||
gitlab-sidekiq-fetcher
|
||||
gitlab-default_value_for (~> 3.1.1)
|
||||
gitlab-markup (~> 1.6.5)
|
||||
gitlab-sidekiq-fetcher (~> 0.1.0)
|
||||
gitlab-styles (~> 2.4)
|
||||
gitlab_omniauth-ldap (~> 2.0.4)
|
||||
gon (~> 6.2)
|
||||
google-api-client (~> 0.23)
|
||||
google-protobuf (~> 3.6)
|
||||
gpgme
|
||||
grape (~> 1.1)
|
||||
gpgme (~> 2.0.18)
|
||||
grape (~> 1.1.0)
|
||||
grape-entity (~> 0.7.1)
|
||||
grape-path-helpers (~> 1.0)
|
||||
grape_logging (~> 1.7)
|
||||
graphiql-rails (~> 1.4.10)
|
||||
graphql (~> 1.8.0)
|
||||
grpc (~> 1.15.0)
|
||||
haml_lint (~> 0.26.0)
|
||||
haml_lint (~> 0.28.0)
|
||||
hamlit (~> 2.8.8)
|
||||
hangouts-chat (~> 0.0.5)
|
||||
hashie-forbidden_attributes
|
||||
|
@ -1027,8 +1042,8 @@ DEPENDENCIES
|
|||
json-schema (~> 2.8.0)
|
||||
jwt (~> 1.5.6)
|
||||
kaminari (~> 1.0)
|
||||
knapsack (~> 1.16)
|
||||
kubeclient (~> 3.1.0)
|
||||
knapsack (~> 1.17)
|
||||
kubeclient (~> 4.0.0)
|
||||
letter_opener_web (~> 1.3.0)
|
||||
license_finder (~> 5.4)
|
||||
licensee (~> 8.9)
|
||||
|
@ -1036,9 +1051,11 @@ DEPENDENCIES
|
|||
loofah (~> 2.2)
|
||||
mail_room (~> 0.9.1)
|
||||
method_source (~> 0.8)
|
||||
mimemagic (~> 0.3.2)
|
||||
mini_magick
|
||||
minitest (~> 5.7.0)
|
||||
mysql2 (~> 0.4.10)
|
||||
nakayoshi_fork (~> 0.0.4)
|
||||
net-ldap
|
||||
net-ssh (~> 5.0)
|
||||
nokogiri (~> 1.8.2)
|
||||
|
@ -1073,13 +1090,15 @@ DEPENDENCIES
|
|||
pry-rails (~> 0.3.4)
|
||||
puma (~> 3.12)
|
||||
puma_worker_killer
|
||||
rack (= 2.0.6)
|
||||
rack-attack (~> 4.4.1)
|
||||
rack-cors (~> 1.0.0)
|
||||
rack-oauth2 (~> 1.2.1)
|
||||
rack-proxy (~> 0.6.0)
|
||||
rails (= 4.2.10)
|
||||
rails (= 5.0.7)
|
||||
rails-controller-testing
|
||||
rails-deprecated_sanitizer (~> 1.0.3)
|
||||
rails-i18n (~> 4.0.9)
|
||||
rails-i18n (~> 5.1)
|
||||
rainbow (~> 3.0)
|
||||
raindrops (~> 0.18)
|
||||
rblineprof (~> 0.3.6)
|
||||
|
@ -1132,7 +1151,6 @@ DEPENDENCIES
|
|||
state_machines-activerecord (~> 0.5.1)
|
||||
sys-filesystem (~> 1.1.6)
|
||||
test-prof (~> 0.2.5)
|
||||
test_after_commit (~> 1.1)
|
||||
thin (~> 1.7.0)
|
||||
timecop (~> 0.8.0)
|
||||
toml-rb (~> 1.0.0)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# BUNDLE_GEMFILE=Gemfile.rails5 bundle install
|
||||
# BUNDLE_GEMFILE=Gemfile.rails4 bundle install
|
||||
|
||||
ENV["RAILS5"] = "true"
|
||||
ENV["RAILS5"] = "false"
|
||||
|
||||
gemfile = File.expand_path("../Gemfile", __FILE__)
|
||||
|
|
@ -4,44 +4,41 @@ GEM
|
|||
RedCloth (4.3.2)
|
||||
abstract_type (0.0.7)
|
||||
ace-rails-ap (4.1.2)
|
||||
actioncable (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
nio4r (>= 1.2, < 3.0)
|
||||
websocket-driver (~> 0.6.1)
|
||||
actionmailer (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activejob (= 5.0.7)
|
||||
actionmailer (4.2.11)
|
||||
actionpack (= 4.2.11)
|
||||
actionview (= 4.2.11)
|
||||
activejob (= 4.2.11)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 2.0)
|
||||
actionpack (5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
rack (~> 2.0)
|
||||
rack-test (~> 0.6.3)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.11)
|
||||
actionview (= 4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
actionview (4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 2.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||
activejob (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
globalid (>= 0.3.6)
|
||||
activemodel (5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
activerecord (5.0.7)
|
||||
activemodel (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
arel (~> 7.0)
|
||||
activerecord_sane_schema_dumper (1.0)
|
||||
rails (>= 5, < 6)
|
||||
activesupport (5.0.7)
|
||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||
i18n (>= 0.7, < 2)
|
||||
activejob (4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
globalid (>= 0.3.0)
|
||||
activemodel (4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.11)
|
||||
activemodel (= 4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
arel (~> 6.0)
|
||||
activerecord_sane_schema_dumper (0.2)
|
||||
rails (>= 4, < 5)
|
||||
activesupport (4.2.11)
|
||||
i18n (~> 0.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
acts-as-taggable-on (5.0.0)
|
||||
activerecord (>= 4.2.8)
|
||||
|
@ -52,13 +49,13 @@ GEM
|
|||
public_suffix (>= 2.0.2, < 4.0)
|
||||
aes_key_wrap (1.0.1)
|
||||
akismet (2.0.0)
|
||||
arel (7.1.4)
|
||||
asana (0.6.0)
|
||||
arel (6.0.4)
|
||||
asana (0.8.1)
|
||||
faraday (~> 0.9)
|
||||
faraday_middleware (~> 0.9)
|
||||
faraday_middleware-multi_json (~> 0.0)
|
||||
oauth2 (~> 1.0)
|
||||
asciidoctor (1.5.6.2)
|
||||
asciidoctor (1.5.8)
|
||||
asciidoctor-plantuml (0.0.8)
|
||||
asciidoctor (~> 1.5)
|
||||
ast (2.4.0)
|
||||
|
@ -73,16 +70,17 @@ GEM
|
|||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
babosa (1.0.2)
|
||||
base32 (0.3.2)
|
||||
batch-loader (1.2.1)
|
||||
batch-loader (1.2.2)
|
||||
bcrypt (3.1.12)
|
||||
bcrypt_pbkdf (1.0.0)
|
||||
benchmark-ips (2.3.0)
|
||||
better_errors (2.1.1)
|
||||
better_errors (2.5.0)
|
||||
coderay (>= 1.0.0)
|
||||
erubis (>= 2.6.6)
|
||||
erubi (>= 1.0.0)
|
||||
rack (>= 0.9.0)
|
||||
bindata (2.4.3)
|
||||
binding_of_caller (0.7.2)
|
||||
binding_ninja (0.2.2)
|
||||
binding_of_caller (0.8.0)
|
||||
debug_inspector (>= 0.0.1)
|
||||
bootsnap (1.3.2)
|
||||
msgpack (~> 1.0)
|
||||
|
@ -128,9 +126,9 @@ GEM
|
|||
concord (0.1.5)
|
||||
adamantium (~> 0.2.0)
|
||||
equalizer (~> 0.0.9)
|
||||
concurrent-ruby (1.0.5)
|
||||
concurrent-ruby-ext (1.0.5)
|
||||
concurrent-ruby (= 1.0.5)
|
||||
concurrent-ruby (1.1.3)
|
||||
concurrent-ruby-ext (1.1.3)
|
||||
concurrent-ruby (= 1.1.3)
|
||||
connection_pool (2.2.2)
|
||||
crack (0.4.3)
|
||||
safe_yaml (~> 1.0.0)
|
||||
|
@ -140,14 +138,14 @@ GEM
|
|||
addressable
|
||||
daemons (1.2.6)
|
||||
database_cleaner (1.5.3)
|
||||
debug_inspector (0.0.2)
|
||||
debug_inspector (0.0.3)
|
||||
debugger-ruby_core_source (1.3.8)
|
||||
deckar01-task_list (2.0.0)
|
||||
html-pipeline
|
||||
declarative (0.0.10)
|
||||
declarative-option (0.1.0)
|
||||
default_value_for (3.0.5)
|
||||
activerecord (>= 3.2.0, < 5.2)
|
||||
default_value_for (3.0.2)
|
||||
activerecord (>= 3.2.0, < 5.1)
|
||||
descendants_tracker (0.0.4)
|
||||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
device_detector (1.0.0)
|
||||
|
@ -165,6 +163,8 @@ GEM
|
|||
rotp (~> 2.0)
|
||||
diff-lcs (1.3)
|
||||
diffy (3.1.0)
|
||||
discordrb-webhooks-blackst0ne (3.3.0)
|
||||
rest-client (~> 2.0)
|
||||
docile (1.1.5)
|
||||
domain_name (0.5.20180417)
|
||||
unf (>= 0.0.5, < 1.0.0)
|
||||
|
@ -181,8 +181,9 @@ GEM
|
|||
mail (~> 2.7)
|
||||
encryptor (3.0.0)
|
||||
equalizer (0.0.11)
|
||||
erubi (1.7.1)
|
||||
erubis (2.7.0)
|
||||
escape_utils (1.1.1)
|
||||
escape_utils (1.2.1)
|
||||
et-orbi (1.0.3)
|
||||
tzinfo
|
||||
eventmachine (1.2.7)
|
||||
|
@ -203,7 +204,7 @@ GEM
|
|||
multi_json
|
||||
fast_blank (1.0.0)
|
||||
fast_gettext (1.6.0)
|
||||
ffaker (2.4.0)
|
||||
ffaker (2.10.0)
|
||||
ffi (1.9.25)
|
||||
flipper (0.13.0)
|
||||
flipper-active_record (0.13.0)
|
||||
|
@ -272,11 +273,11 @@ GEM
|
|||
gettext_i18n_rails (>= 0.7.1)
|
||||
po_to_json (>= 1.0.0)
|
||||
rails (>= 3.2.0)
|
||||
gitaly-proto (0.123.0)
|
||||
gitaly-proto (1.3.0)
|
||||
grpc (~> 1.0)
|
||||
github-markup (1.7.0)
|
||||
gitlab-markup (1.6.4)
|
||||
gitlab-sidekiq-fetcher (0.3.0)
|
||||
gitlab-markup (1.6.5)
|
||||
gitlab-sidekiq-fetcher (0.1.0)
|
||||
sidekiq (~> 5)
|
||||
gitlab-styles (2.4.1)
|
||||
rubocop (~> 0.54.0)
|
||||
|
@ -310,8 +311,8 @@ GEM
|
|||
multi_json (~> 1.11)
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (~> 0.7)
|
||||
gpgme (2.0.13)
|
||||
mini_portile2 (~> 2.1)
|
||||
gpgme (2.0.18)
|
||||
mini_portile2 (~> 2.3)
|
||||
grape (1.1.0)
|
||||
activesupport
|
||||
builder
|
||||
|
@ -338,11 +339,11 @@ GEM
|
|||
haml (5.0.4)
|
||||
temple (>= 0.8.0)
|
||||
tilt
|
||||
haml_lint (0.26.0)
|
||||
haml_lint (0.28.0)
|
||||
haml (>= 4.0, < 5.1)
|
||||
rainbow
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.49.0)
|
||||
rubocop (>= 0.50.0)
|
||||
sysexits (~> 1.1)
|
||||
hamlit (2.8.8)
|
||||
temple (>= 0.8.0)
|
||||
|
@ -364,20 +365,20 @@ GEM
|
|||
html2text (0.2.0)
|
||||
nokogiri (~> 1.6)
|
||||
htmlentities (4.3.4)
|
||||
http (2.2.2)
|
||||
http (3.3.0)
|
||||
addressable (~> 2.3)
|
||||
http-cookie (~> 1.0)
|
||||
http-form_data (~> 1.0.1)
|
||||
http-form_data (~> 2.0)
|
||||
http_parser.rb (~> 0.6.0)
|
||||
http-cookie (1.0.3)
|
||||
domain_name (~> 0.5)
|
||||
http-form_data (1.0.3)
|
||||
http-form_data (2.1.1)
|
||||
http_parser.rb (0.6.0)
|
||||
httparty (0.13.7)
|
||||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpclient (2.8.3)
|
||||
i18n (1.1.0)
|
||||
i18n (0.9.5)
|
||||
concurrent-ruby (~> 1.0)
|
||||
icalendar (2.4.1)
|
||||
ice_nine (0.11.2)
|
||||
|
@ -413,10 +414,10 @@ GEM
|
|||
kaminari-core (= 1.0.1)
|
||||
kaminari-core (1.0.1)
|
||||
kgio (2.10.0)
|
||||
knapsack (1.16.0)
|
||||
knapsack (1.17.0)
|
||||
rake
|
||||
kubeclient (3.1.0)
|
||||
http (~> 2.2.2)
|
||||
kubeclient (4.0.0)
|
||||
http (~> 3.0)
|
||||
recursive-open-struct (~> 1.0, >= 1.0.4)
|
||||
rest-client (~> 2.0)
|
||||
launchy (2.4.3)
|
||||
|
@ -442,7 +443,7 @@ GEM
|
|||
activesupport (>= 4)
|
||||
railties (>= 4)
|
||||
request_store (~> 1.0)
|
||||
loofah (2.2.2)
|
||||
loofah (2.2.3)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.5.9)
|
||||
mail (2.7.0)
|
||||
|
@ -452,10 +453,10 @@ GEM
|
|||
memoizable (0.4.2)
|
||||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
method_source (0.9.0)
|
||||
mime-types (3.1)
|
||||
mime-types (3.2.2)
|
||||
mime-types-data (~> 3.2015)
|
||||
mime-types-data (3.2016.0521)
|
||||
mimemagic (0.3.0)
|
||||
mime-types-data (3.2018.0812)
|
||||
mimemagic (0.3.2)
|
||||
mini_magick (4.8.0)
|
||||
mini_mime (1.0.1)
|
||||
mini_portile2 (2.3.0)
|
||||
|
@ -468,11 +469,11 @@ GEM
|
|||
mustermann-grape (1.0.0)
|
||||
mustermann (~> 1.0.0)
|
||||
mysql2 (0.4.10)
|
||||
nakayoshi_fork (0.0.4)
|
||||
net-ldap (0.16.0)
|
||||
net-ssh (5.0.1)
|
||||
netrc (0.11.0)
|
||||
nio4r (2.3.1)
|
||||
nokogiri (1.8.4)
|
||||
nokogiri (1.8.5)
|
||||
mini_portile2 (~> 2.3.0)
|
||||
nokogumbo (1.5.0)
|
||||
nokogiri
|
||||
|
@ -544,7 +545,7 @@ GEM
|
|||
orm_adapter (0.5.0)
|
||||
os (1.0.0)
|
||||
parallel (1.12.1)
|
||||
parser (2.5.1.2)
|
||||
parser (2.5.3.0)
|
||||
ast (~> 2.4.0)
|
||||
parslet (1.8.2)
|
||||
peek (1.0.1)
|
||||
|
@ -600,7 +601,7 @@ GEM
|
|||
get_process_mem (~> 0.2)
|
||||
puma (>= 2.7, < 4)
|
||||
pyu-ruby-sasl (0.0.3.3)
|
||||
rack (2.0.5)
|
||||
rack (1.6.11)
|
||||
rack-accept (0.4.5)
|
||||
rack (>= 0.4)
|
||||
rack-attack (4.4.1)
|
||||
|
@ -612,47 +613,42 @@ GEM
|
|||
httpclient (>= 2.4)
|
||||
multi_json (>= 1.3.6)
|
||||
rack (>= 1.1)
|
||||
rack-protection (2.0.3)
|
||||
rack-protection (2.0.4)
|
||||
rack
|
||||
rack-proxy (0.6.0)
|
||||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (5.0.7)
|
||||
actioncable (= 5.0.7)
|
||||
actionmailer (= 5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
actionview (= 5.0.7)
|
||||
activejob (= 5.0.7)
|
||||
activemodel (= 5.0.7)
|
||||
activerecord (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
bundler (>= 1.3.0)
|
||||
railties (= 5.0.7)
|
||||
sprockets-rails (>= 2.0.0)
|
||||
rails-controller-testing (1.0.2)
|
||||
actionpack (~> 5.x, >= 5.0.1)
|
||||
actionview (~> 5.x, >= 5.0.1)
|
||||
activesupport (~> 5.x)
|
||||
rails (4.2.11)
|
||||
actionmailer (= 4.2.11)
|
||||
actionpack (= 4.2.11)
|
||||
actionview (= 4.2.11)
|
||||
activejob (= 4.2.11)
|
||||
activemodel (= 4.2.11)
|
||||
activerecord (= 4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.2.11)
|
||||
sprockets-rails
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (2.0.3)
|
||||
activesupport (>= 4.2.0)
|
||||
nokogiri (>= 1.6)
|
||||
rails-dom-testing (1.0.9)
|
||||
activesupport (>= 4.2.0, < 5.0)
|
||||
nokogiri (~> 1.6)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.4)
|
||||
loofah (~> 2.2, >= 2.2.2)
|
||||
rails-i18n (5.1.1)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 5.0, < 6)
|
||||
railties (5.0.7)
|
||||
actionpack (= 5.0.7)
|
||||
activesupport (= 5.0.7)
|
||||
method_source
|
||||
rails-i18n (4.0.9)
|
||||
i18n (~> 0.7)
|
||||
railties (~> 4.0)
|
||||
railties (4.2.11)
|
||||
actionpack (= 4.2.11)
|
||||
activesupport (= 4.2.11)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rainbow (3.0.0)
|
||||
raindrops (0.18.0)
|
||||
rake (12.3.1)
|
||||
rake (12.3.2)
|
||||
rb-fsevent (0.10.2)
|
||||
rb-inotify (0.9.10)
|
||||
ffi (>= 0.5.0, < 2)
|
||||
|
@ -685,7 +681,7 @@ GEM
|
|||
redis-actionpack (>= 5.0, < 6)
|
||||
redis-activesupport (>= 5.0, < 6)
|
||||
redis-store (>= 1.2, < 2)
|
||||
redis-store (1.4.1)
|
||||
redis-store (1.6.0)
|
||||
redis (>= 2.2, < 5)
|
||||
regexp_parser (0.5.0)
|
||||
representable (3.0.4)
|
||||
|
@ -720,8 +716,8 @@ GEM
|
|||
rspec-mocks (3.7.0)
|
||||
diff-lcs (>= 1.2.0, < 2.0)
|
||||
rspec-support (~> 3.7.0)
|
||||
rspec-parameterized (0.4.0)
|
||||
binding_of_caller
|
||||
rspec-parameterized (0.4.1)
|
||||
binding_ninja (>= 0.2.1)
|
||||
parser
|
||||
proc_to_ast
|
||||
rspec (>= 2.13, < 4)
|
||||
|
@ -738,7 +734,8 @@ GEM
|
|||
rspec-core
|
||||
rspec-set (0.1.3)
|
||||
rspec-support (3.7.1)
|
||||
rspec_junit_formatter (0.4.1)
|
||||
rspec_junit_formatter (0.2.3)
|
||||
builder (< 4)
|
||||
rspec-core (>= 2, < 4, != 2.12.0)
|
||||
rspec_profiling (0.0.5)
|
||||
activerecord
|
||||
|
@ -764,8 +761,8 @@ GEM
|
|||
ruby-progressbar (1.9.0)
|
||||
ruby-saml (1.7.2)
|
||||
nokogiri (>= 1.5.10)
|
||||
ruby_parser (3.9.0)
|
||||
sexp_processor (~> 4.1)
|
||||
ruby_parser (3.11.0)
|
||||
sexp_processor (~> 4.9)
|
||||
rubyntlm (0.6.2)
|
||||
rubypants (0.2.0)
|
||||
rubyzip (1.2.2)
|
||||
|
@ -805,12 +802,12 @@ GEM
|
|||
sentry-raven (2.7.2)
|
||||
faraday (>= 0.7.6, < 1.0)
|
||||
settingslogic (2.0.9)
|
||||
sexp_processor (4.9.0)
|
||||
sexp_processor (4.11.0)
|
||||
sham_rack (1.3.6)
|
||||
rack
|
||||
shoulda-matchers (3.1.2)
|
||||
activesupport (>= 4.0.0)
|
||||
sidekiq (5.2.1)
|
||||
sidekiq (5.2.3)
|
||||
connection_pool (~> 2.2, >= 2.2.2)
|
||||
rack-protection (>= 1.5.0)
|
||||
redis (>= 3.3.5, < 5)
|
||||
|
@ -855,6 +852,8 @@ GEM
|
|||
sysexits (1.2.0)
|
||||
temple (0.8.0)
|
||||
test-prof (0.2.5)
|
||||
test_after_commit (1.1.0)
|
||||
activerecord (>= 3.2)
|
||||
text (1.3.1)
|
||||
thin (1.7.2)
|
||||
daemons (~> 1.0, >= 1.0.9)
|
||||
|
@ -891,7 +890,7 @@ GEM
|
|||
get_process_mem (~> 0)
|
||||
unicorn (>= 4, < 6)
|
||||
uniform_notifier (1.10.0)
|
||||
unparser (0.2.7)
|
||||
unparser (0.4.2)
|
||||
abstract_type (~> 0.0.7)
|
||||
adamantium (~> 0.2.0)
|
||||
concord (~> 0.1.5)
|
||||
|
@ -917,9 +916,6 @@ GEM
|
|||
hashdiff
|
||||
webpack-rails (0.9.11)
|
||||
railties (>= 3.2.0)
|
||||
websocket-driver (0.6.5)
|
||||
websocket-extensions (>= 0.1.0)
|
||||
websocket-extensions (0.1.3)
|
||||
wikicloth (0.8.1)
|
||||
builder
|
||||
expression_parser
|
||||
|
@ -935,22 +931,22 @@ PLATFORMS
|
|||
DEPENDENCIES
|
||||
RedCloth (~> 4.3.2)
|
||||
ace-rails-ap (~> 4.1.0)
|
||||
activerecord_sane_schema_dumper (= 1.0)
|
||||
activerecord_sane_schema_dumper (= 0.2)
|
||||
acts-as-taggable-on (~> 5.0)
|
||||
addressable (~> 2.5.2)
|
||||
akismet (~> 2.0)
|
||||
asana (~> 0.6.0)
|
||||
asciidoctor (~> 1.5.6)
|
||||
asana (~> 0.8.1)
|
||||
asciidoctor (~> 1.5.8)
|
||||
asciidoctor-plantuml (= 0.0.8)
|
||||
attr_encrypted (~> 3.1.0)
|
||||
awesome_print
|
||||
babosa (~> 1.0.2)
|
||||
base32 (~> 0.3.0)
|
||||
batch-loader (~> 1.2.1)
|
||||
batch-loader (~> 1.2.2)
|
||||
bcrypt_pbkdf (~> 1.0)
|
||||
benchmark-ips (~> 2.3.0)
|
||||
better_errors (~> 2.1.0)
|
||||
binding_of_caller (~> 0.7.2)
|
||||
better_errors (~> 2.5.0)
|
||||
binding_of_caller (~> 0.8.0)
|
||||
bootsnap (~> 1.3)
|
||||
bootstrap_form (~> 2.7.0)
|
||||
brakeman (~> 4.2)
|
||||
|
@ -964,16 +960,17 @@ DEPENDENCIES
|
|||
chronic (~> 0.10.2)
|
||||
chronic_duration (~> 0.10.6)
|
||||
commonmarker (~> 0.17)
|
||||
concurrent-ruby (~> 1.0.5)
|
||||
concurrent-ruby (~> 1.1)
|
||||
connection_pool (~> 2.0)
|
||||
creole (~> 0.5.0)
|
||||
database_cleaner (~> 1.5.0)
|
||||
deckar01-task_list (= 2.0.0)
|
||||
default_value_for (~> 3.0.5)
|
||||
default_value_for (~> 3.0.0)
|
||||
device_detector
|
||||
devise (~> 4.4)
|
||||
devise-two-factor (~> 3.0.0)
|
||||
diffy (~> 3.1.0)
|
||||
discordrb-webhooks-blackst0ne (~> 3.3)
|
||||
doorkeeper (~> 4.3)
|
||||
doorkeeper-openid_connect (~> 1.5)
|
||||
ed25519 (~> 1.2)
|
||||
|
@ -983,7 +980,7 @@ DEPENDENCIES
|
|||
factory_bot_rails (~> 4.8.2)
|
||||
faraday (~> 0.12)
|
||||
fast_blank
|
||||
ffaker (~> 2.4)
|
||||
ffaker (~> 2.10)
|
||||
flipper (~> 0.13.0)
|
||||
flipper-active_record (~> 0.13.0)
|
||||
flipper-active_support_cache_store (~> 0.13.0)
|
||||
|
@ -1002,24 +999,24 @@ DEPENDENCIES
|
|||
gettext (~> 3.2.2)
|
||||
gettext_i18n_rails (~> 1.8.0)
|
||||
gettext_i18n_rails_js (~> 1.3)
|
||||
gitaly-proto (~> 0.123.0)
|
||||
gitaly-proto (~> 1.3.0)
|
||||
github-markup (~> 1.7.0)
|
||||
gitlab-markup (~> 1.6.4)
|
||||
gitlab-sidekiq-fetcher
|
||||
gitlab-markup (~> 1.6.5)
|
||||
gitlab-sidekiq-fetcher (~> 0.1.0)
|
||||
gitlab-styles (~> 2.4)
|
||||
gitlab_omniauth-ldap (~> 2.0.4)
|
||||
gon (~> 6.2)
|
||||
google-api-client (~> 0.23)
|
||||
google-protobuf (~> 3.6)
|
||||
gpgme
|
||||
grape (~> 1.1)
|
||||
gpgme (~> 2.0.18)
|
||||
grape (~> 1.1.0)
|
||||
grape-entity (~> 0.7.1)
|
||||
grape-path-helpers (~> 1.0)
|
||||
grape_logging (~> 1.7)
|
||||
graphiql-rails (~> 1.4.10)
|
||||
graphql (~> 1.8.0)
|
||||
grpc (~> 1.15.0)
|
||||
haml_lint (~> 0.26.0)
|
||||
haml_lint (~> 0.28.0)
|
||||
hamlit (~> 2.8.8)
|
||||
hangouts-chat (~> 0.0.5)
|
||||
hashie-forbidden_attributes
|
||||
|
@ -1036,8 +1033,8 @@ DEPENDENCIES
|
|||
json-schema (~> 2.8.0)
|
||||
jwt (~> 1.5.6)
|
||||
kaminari (~> 1.0)
|
||||
knapsack (~> 1.16)
|
||||
kubeclient (~> 3.1.0)
|
||||
knapsack (~> 1.17)
|
||||
kubeclient (~> 4.0.0)
|
||||
letter_opener_web (~> 1.3.0)
|
||||
license_finder (~> 5.4)
|
||||
licensee (~> 8.9)
|
||||
|
@ -1045,9 +1042,11 @@ DEPENDENCIES
|
|||
loofah (~> 2.2)
|
||||
mail_room (~> 0.9.1)
|
||||
method_source (~> 0.8)
|
||||
mimemagic (~> 0.3.2)
|
||||
mini_magick
|
||||
minitest (~> 5.7.0)
|
||||
mysql2 (~> 0.4.10)
|
||||
nakayoshi_fork (~> 0.0.4)
|
||||
net-ldap
|
||||
net-ssh (~> 5.0)
|
||||
nokogiri (~> 1.8.2)
|
||||
|
@ -1082,14 +1081,14 @@ DEPENDENCIES
|
|||
pry-rails (~> 0.3.4)
|
||||
puma (~> 3.12)
|
||||
puma_worker_killer
|
||||
rack (= 1.6.11)
|
||||
rack-attack (~> 4.4.1)
|
||||
rack-cors (~> 1.0.0)
|
||||
rack-oauth2 (~> 1.2.1)
|
||||
rack-proxy (~> 0.6.0)
|
||||
rails (= 5.0.7)
|
||||
rails-controller-testing
|
||||
rails (= 4.2.11)
|
||||
rails-deprecated_sanitizer (~> 1.0.3)
|
||||
rails-i18n (~> 5.1)
|
||||
rails-i18n (~> 4.0.9)
|
||||
rainbow (~> 3.0)
|
||||
raindrops (~> 0.18)
|
||||
rblineprof (~> 0.3.6)
|
||||
|
@ -1142,6 +1141,7 @@ DEPENDENCIES
|
|||
state_machines-activerecord (~> 0.5.1)
|
||||
sys-filesystem (~> 1.1.6)
|
||||
test-prof (~> 0.2.5)
|
||||
test_after_commit (~> 1.1)
|
||||
thin (~> 1.7.0)
|
||||
timecop (~> 0.8.0)
|
||||
toml-rb (~> 1.0.0)
|
1
PHILOSOPHY.md
Normal file
1
PHILOSOPHY.md
Normal file
|
@ -0,0 +1 @@
|
|||
This document is intended to communicate the product philosophy GitLab uses in creating GitLab Community Edition. The principles can be found in the [Product Section of the GitLab Handbook](https://about.gitlab.com/handbook/product/#product-at-gitlab).
|
|
@ -95,6 +95,12 @@ picked into the stable branches) up to the 19th of the month. Such merge
|
|||
requests should have the ~"feature flag" label assigned, and don't require a
|
||||
corresponding exception request to be created.
|
||||
|
||||
In order to build the final package and present the feature for self-hosted
|
||||
customers, the feature flag should be removed. This should happen before the
|
||||
22nd, ideally _at least_ 2 days before. That means MRs with feature
|
||||
flags being picked at the 19th would have a quite tight schedule, so picking
|
||||
these _earlier_ is preferable.
|
||||
|
||||
While rare, release managers may decide to reject picking a change into a stable
|
||||
branch, even when feature flags are used. This might be necessary if the changes
|
||||
are deemed problematic, too invasive, or there simply isn't enough time to
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
11.5.5
|
||||
11.6.0
|
||||
|
|
BIN
app/assets/images/cluster_app_logos/cert_manager.png
Normal file
BIN
app/assets/images/cluster_app_logos/cert_manager.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
|
@ -5,22 +5,27 @@ import axios from './lib/utils/axios_utils';
|
|||
const Api = {
|
||||
groupsPath: '/api/:version/groups.json',
|
||||
groupPath: '/api/:version/groups/:id',
|
||||
subgroupsPath: '/api/:version/groups/:id/subgroups',
|
||||
namespacesPath: '/api/:version/namespaces.json',
|
||||
groupProjectsPath: '/api/:version/groups/:id/projects.json',
|
||||
projectsPath: '/api/:version/projects.json',
|
||||
projectPath: '/api/:version/projects/:id',
|
||||
projectLabelsPath: '/:namespace_path/:project_path/labels',
|
||||
mergeRequestPath: '/api/:version/projects/:id/merge_requests/:mrid',
|
||||
projectMergeRequestPath: '/api/:version/projects/:id/merge_requests/:mrid',
|
||||
projectMergeRequestChangesPath: '/api/:version/projects/:id/merge_requests/:mrid/changes',
|
||||
projectMergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions',
|
||||
projectRunnersPath: '/api/:version/projects/:id/runners',
|
||||
mergeRequestsPath: '/api/:version/merge_requests',
|
||||
mergeRequestChangesPath: '/api/:version/projects/:id/merge_requests/:mrid/changes',
|
||||
mergeRequestVersionsPath: '/api/:version/projects/:id/merge_requests/:mrid/versions',
|
||||
groupLabelsPath: '/groups/:namespace_path/-/labels',
|
||||
issuableTemplatePath: '/:namespace_path/:project_path/templates/:type/:key',
|
||||
projectTemplatePath: '/api/:version/projects/:id/templates/:type/:key',
|
||||
projectTemplatesPath: '/api/:version/projects/:id/templates/:type',
|
||||
usersPath: '/api/:version/users.json',
|
||||
userStatusPath: '/api/:version/user/status',
|
||||
userPath: '/api/:version/users/:id',
|
||||
userStatusPath: '/api/:version/users/:id/status',
|
||||
userPostStatusPath: '/api/:version/user/status',
|
||||
commitPath: '/api/:version/projects/:id/repository/commits',
|
||||
applySuggestionPath: '/api/:version/suggestions/:id/apply',
|
||||
commitPipelinesPath: '/:project_id/commit/:sha/pipelines',
|
||||
branchSinglePath: '/api/:version/projects/:id/repository/branches/:branch',
|
||||
createBranchPath: '/api/:version/projects/:id/repository/branches',
|
||||
|
@ -99,36 +104,45 @@ const Api = {
|
|||
},
|
||||
|
||||
// Return Merge Request for project
|
||||
mergeRequest(projectPath, mergeRequestId, params = {}) {
|
||||
const url = Api.buildUrl(Api.mergeRequestPath)
|
||||
projectMergeRequest(projectPath, mergeRequestId, params = {}) {
|
||||
const url = Api.buildUrl(Api.projectMergeRequestPath)
|
||||
.replace(':id', encodeURIComponent(projectPath))
|
||||
.replace(':mrid', mergeRequestId);
|
||||
|
||||
return axios.get(url, { params });
|
||||
},
|
||||
|
||||
projectMergeRequestChanges(projectPath, mergeRequestId) {
|
||||
const url = Api.buildUrl(Api.projectMergeRequestChangesPath)
|
||||
.replace(':id', encodeURIComponent(projectPath))
|
||||
.replace(':mrid', mergeRequestId);
|
||||
|
||||
return axios.get(url);
|
||||
},
|
||||
|
||||
projectMergeRequestVersions(projectPath, mergeRequestId) {
|
||||
const url = Api.buildUrl(Api.projectMergeRequestVersionsPath)
|
||||
.replace(':id', encodeURIComponent(projectPath))
|
||||
.replace(':mrid', mergeRequestId);
|
||||
|
||||
return axios.get(url);
|
||||
},
|
||||
|
||||
projectRunners(projectPath, config = {}) {
|
||||
const url = Api.buildUrl(Api.projectRunnersPath).replace(
|
||||
':id',
|
||||
encodeURIComponent(projectPath),
|
||||
);
|
||||
|
||||
return axios.get(url, config);
|
||||
},
|
||||
|
||||
mergeRequests(params = {}) {
|
||||
const url = Api.buildUrl(Api.mergeRequestsPath);
|
||||
|
||||
return axios.get(url, { params });
|
||||
},
|
||||
|
||||
mergeRequestChanges(projectPath, mergeRequestId) {
|
||||
const url = Api.buildUrl(Api.mergeRequestChangesPath)
|
||||
.replace(':id', encodeURIComponent(projectPath))
|
||||
.replace(':mrid', mergeRequestId);
|
||||
|
||||
return axios.get(url);
|
||||
},
|
||||
|
||||
mergeRequestVersions(projectPath, mergeRequestId) {
|
||||
const url = Api.buildUrl(Api.mergeRequestVersionsPath)
|
||||
.replace(':id', encodeURIComponent(projectPath))
|
||||
.replace(':mrid', mergeRequestId);
|
||||
|
||||
return axios.get(url);
|
||||
},
|
||||
|
||||
newLabel(namespacePath, projectPath, data, callback) {
|
||||
let url;
|
||||
|
||||
|
@ -172,6 +186,12 @@ const Api = {
|
|||
});
|
||||
},
|
||||
|
||||
applySuggestion(id) {
|
||||
const url = Api.buildUrl(Api.applySuggestionPath).replace(':id', encodeURIComponent(id));
|
||||
|
||||
return axios.put(url);
|
||||
},
|
||||
|
||||
commitPipelines(projectId, sha) {
|
||||
const encodedProjectId = projectId
|
||||
.split('/')
|
||||
|
@ -243,6 +263,20 @@ const Api = {
|
|||
});
|
||||
},
|
||||
|
||||
user(id, options) {
|
||||
const url = Api.buildUrl(this.userPath).replace(':id', encodeURIComponent(id));
|
||||
return axios.get(url, {
|
||||
params: options,
|
||||
});
|
||||
},
|
||||
|
||||
userStatus(id, options) {
|
||||
const url = Api.buildUrl(this.userStatusPath).replace(':id', encodeURIComponent(id));
|
||||
return axios.get(url, {
|
||||
params: options,
|
||||
});
|
||||
},
|
||||
|
||||
branches(id, query = '', options = {}) {
|
||||
const url = Api.buildUrl(this.createBranchPath).replace(':id', encodeURIComponent(id));
|
||||
|
||||
|
@ -265,7 +299,7 @@ const Api = {
|
|||
},
|
||||
|
||||
postUserStatus({ emoji, message }) {
|
||||
const url = Api.buildUrl(this.userStatusPath);
|
||||
const url = Api.buildUrl(this.userPostStatusPath);
|
||||
|
||||
return axios.put(url, {
|
||||
emoji,
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
<script>
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import Tooltip from '~/vue_shared/directives/tooltip';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon, GlTooltipDirective } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
name: 'Badge',
|
||||
components: {
|
||||
Icon,
|
||||
Tooltip,
|
||||
GlLoadingIcon,
|
||||
},
|
||||
directives: {
|
||||
Tooltip,
|
||||
GlTooltip: GlTooltipDirective,
|
||||
},
|
||||
props: {
|
||||
imageUrl: {
|
||||
|
@ -65,12 +63,7 @@ export default {
|
|||
|
||||
<template>
|
||||
<div>
|
||||
<a
|
||||
v-show="!isLoading && !hasError"
|
||||
:href="linkUrl"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<a v-show="!isLoading && !hasError" :href="linkUrl" target="_blank" rel="noopener noreferrer">
|
||||
<img
|
||||
:src="imageUrlWithRetries"
|
||||
class="project-badge"
|
||||
|
@ -80,15 +73,9 @@ export default {
|
|||
/>
|
||||
</a>
|
||||
|
||||
<gl-loading-icon
|
||||
v-show="isLoading"
|
||||
:inline="true"
|
||||
/>
|
||||
<gl-loading-icon v-show="isLoading" :inline="true" />
|
||||
|
||||
<div
|
||||
v-show="hasError"
|
||||
class="btn-group"
|
||||
>
|
||||
<div v-show="hasError" class="btn-group">
|
||||
<div class="btn btn-default btn-sm disabled">
|
||||
<icon
|
||||
:size="16"
|
||||
|
@ -97,25 +84,20 @@ export default {
|
|||
aria-hidden="true"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="btn btn-default btn-sm disabled"
|
||||
>
|
||||
<div class="btn btn-default btn-sm disabled">
|
||||
<span class="prepend-left-8 append-right-8">{{ s__('Badges|No badge image') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
v-show="hasError"
|
||||
v-tooltip
|
||||
v-gl-tooltip.hover
|
||||
:title="s__('Badges|Reload badge image')"
|
||||
class="btn btn-transparent btn-sm text-primary"
|
||||
type="button"
|
||||
@click="reloadImage"
|
||||
>
|
||||
<icon
|
||||
:size="16"
|
||||
name="retry"
|
||||
/>
|
||||
<icon :size="16" name="retry" />
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -4,7 +4,7 @@ import { mapActions, mapState } from 'vuex';
|
|||
import createFlash from '~/flash';
|
||||
import { s__, sprintf } from '~/locale';
|
||||
import LoadingButton from '~/vue_shared/components/loading_button.vue';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import createEmptyBadge from '../empty_badge';
|
||||
import Badge from './badge.vue';
|
||||
|
||||
|
@ -155,10 +155,7 @@ export default {
|
|||
@submit.prevent.stop="onSubmit"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label
|
||||
for="badge-link-url"
|
||||
class="label-bold"
|
||||
>{{ s__('Badges|Link') }}</label>
|
||||
<label for="badge-link-url" class="label-bold">{{ s__('Badges|Link') }}</label>
|
||||
<p v-html="helpText"></p>
|
||||
<input
|
||||
id="badge-link-url"
|
||||
|
@ -168,19 +165,12 @@ export default {
|
|||
required
|
||||
@input="debouncedPreview"
|
||||
/>
|
||||
<div class="invalid-feedback">
|
||||
{{ s__('Badges|Please fill in a valid URL') }}
|
||||
</div>
|
||||
<span class="form-text text-muted">
|
||||
{{ badgeLinkUrlExample }}
|
||||
</span>
|
||||
<div class="invalid-feedback">{{ s__('Badges|Please fill in a valid URL') }}</div>
|
||||
<span class="form-text text-muted"> {{ badgeLinkUrlExample }} </span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label
|
||||
for="badge-image-url"
|
||||
class="label-bold"
|
||||
>{{ s__('Badges|Badge image URL') }}</label>
|
||||
<label for="badge-image-url" class="label-bold">{{ s__('Badges|Badge image URL') }}</label>
|
||||
<p v-html="helpText"></p>
|
||||
<input
|
||||
id="badge-image-url"
|
||||
|
@ -190,12 +180,8 @@ export default {
|
|||
required
|
||||
@input="debouncedPreview"
|
||||
/>
|
||||
<div class="invalid-feedback">
|
||||
{{ s__('Badges|Please fill in a valid URL') }}
|
||||
</div>
|
||||
<span class="form-text text-muted">
|
||||
{{ badgeImageUrlExample }}
|
||||
</span>
|
||||
<div class="invalid-feedback">{{ s__('Badges|Please fill in a valid URL') }}</div>
|
||||
<span class="form-text text-muted"> {{ badgeImageUrlExample }} </span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
|
@ -206,37 +192,22 @@ export default {
|
|||
:image-url="renderedImageUrl"
|
||||
:link-url="renderedLinkUrl"
|
||||
/>
|
||||
<p v-show="isRendering">
|
||||
<gl-loading-icon
|
||||
:inline="true"
|
||||
/>
|
||||
<p v-show="isRendering"><gl-loading-icon :inline="true" /></p>
|
||||
<p v-show="!renderedBadge && !isRendering" class="disabled-content">
|
||||
{{ s__('Badges|No image to preview') }}
|
||||
</p>
|
||||
<p
|
||||
v-show="!renderedBadge && !isRendering"
|
||||
class="disabled-content"
|
||||
>{{ s__('Badges|No image to preview') }}</p>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="isEditing"
|
||||
class="row-content-block"
|
||||
>
|
||||
<div v-if="isEditing" class="row-content-block">
|
||||
<loading-button
|
||||
:loading="isSaving"
|
||||
:label="s__('Badges|Save changes')"
|
||||
type="submit"
|
||||
container-class="btn btn-success"
|
||||
/>
|
||||
<button
|
||||
class="btn btn-cancel"
|
||||
type="button"
|
||||
@click="onCancel"
|
||||
>{{ __('Cancel') }}</button>
|
||||
<button class="btn btn-cancel" type="button" @click="onCancel">{{ __('Cancel') }}</button>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="form-group"
|
||||
>
|
||||
<div v-else class="form-group">
|
||||
<loading-button
|
||||
:loading="isSaving"
|
||||
:label="s__('Badges|Add badge')"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script>
|
||||
import { mapState } from 'vuex';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import BadgeListRow from './badge_list_row.vue';
|
||||
import { GROUP_BADGE } from '../constants';
|
||||
|
||||
|
@ -26,32 +26,15 @@ export default {
|
|||
<div class="card">
|
||||
<div class="card-header">
|
||||
{{ s__('Badges|Your badges') }}
|
||||
<span
|
||||
v-show="!isLoading"
|
||||
class="badge badge-pill"
|
||||
>{{ badges.length }}</span>
|
||||
<span v-show="!isLoading" class="badge badge-pill">{{ badges.length }}</span>
|
||||
</div>
|
||||
<gl-loading-icon
|
||||
v-show="isLoading"
|
||||
:size="2"
|
||||
class="card-body"
|
||||
/>
|
||||
<div
|
||||
v-if="hasNoBadges"
|
||||
class="card-body"
|
||||
>
|
||||
<gl-loading-icon v-show="isLoading" :size="2" class="card-body" />
|
||||
<div v-if="hasNoBadges" class="card-body">
|
||||
<span v-if="isGroupBadge">{{ s__('Badges|This group has no badges') }}</span>
|
||||
<span v-else>{{ s__('Badges|This project has no badges') }}</span>
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
class="card-body"
|
||||
>
|
||||
<badge-list-row
|
||||
v-for="badge in badges"
|
||||
:key="badge.id"
|
||||
:badge="badge"
|
||||
/>
|
||||
<div v-else class="card-body">
|
||||
<badge-list-row v-for="badge in badges" :key="badge.id" :badge="badge" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
import { mapActions, mapState } from 'vuex';
|
||||
import { s__ } from '~/locale';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import { PROJECT_BADGE } from '../constants';
|
||||
import Badge from './badge.vue';
|
||||
|
||||
|
@ -50,20 +50,14 @@ export default {
|
|||
<span class="badge badge-pill">{{ badgeKindText }}</span>
|
||||
</div>
|
||||
<div class="table-section section-15 table-button-footer">
|
||||
<div
|
||||
v-if="canEditBadge"
|
||||
class="table-action-buttons">
|
||||
<div v-if="canEditBadge" class="table-action-buttons">
|
||||
<button
|
||||
:disabled="badge.isDeleting"
|
||||
class="btn btn-default append-right-8"
|
||||
type="button"
|
||||
@click="editBadge(badge)"
|
||||
@click="editBadge(badge);"
|
||||
>
|
||||
<icon
|
||||
:size="16"
|
||||
:aria-label="__('Edit')"
|
||||
name="pencil"
|
||||
/>
|
||||
<icon :size="16" :aria-label="__('Edit')" name="pencil" />
|
||||
</button>
|
||||
<button
|
||||
:disabled="badge.isDeleting"
|
||||
|
@ -71,18 +65,11 @@ export default {
|
|||
type="button"
|
||||
data-toggle="modal"
|
||||
data-target="#delete-badge-modal"
|
||||
@click="updateBadgeInModal(badge)"
|
||||
@click="updateBadgeInModal(badge);"
|
||||
>
|
||||
<icon
|
||||
:size="16"
|
||||
:aria-label="__('Delete')"
|
||||
name="remove"
|
||||
/>
|
||||
<icon :size="16" :aria-label="__('Delete')" name="remove" />
|
||||
</button>
|
||||
<gl-loading-icon
|
||||
v-show="badge.isDeleting"
|
||||
:inline="true"
|
||||
/>
|
||||
<gl-loading-icon v-show="badge.isDeleting" :inline="true" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -46,7 +46,8 @@ export default {
|
|||
:header-title-text="s__('Badges|Delete badge?')"
|
||||
:footer-primary-button-text="s__('Badges|Delete badge')"
|
||||
footer-primary-button-variant="danger"
|
||||
@submit="onSubmitModal">
|
||||
@submit="onSubmitModal"
|
||||
>
|
||||
<div class="well">
|
||||
<badge
|
||||
:image-url="badgeInModal ? badgeInModal.renderedImageUrl : ''"
|
||||
|
@ -56,15 +57,9 @@ export default {
|
|||
<p v-html="deleteModalText"></p>
|
||||
</gl-modal>
|
||||
|
||||
<badge-form
|
||||
v-show="isEditing"
|
||||
:is-editing="true"
|
||||
/>
|
||||
<badge-form v-show="isEditing" :is-editing="true" />
|
||||
|
||||
<badge-form
|
||||
v-show="!isEditing"
|
||||
:is-editing="false"
|
||||
/>
|
||||
<badge-form v-show="!isEditing" :is-editing="false" />
|
||||
<badge-list v-show="!isEditing" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
import $ from 'jquery';
|
||||
import { convertPermissionToBoolean } from '~/lib/utils/common_utils';
|
||||
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||
import GfmAutoComplete from '~/gfm_auto_complete';
|
||||
|
||||
export default function initGFMInput() {
|
||||
$('.js-gfm-input:not(.js-vue-textarea)').each((i, el) => {
|
||||
const gfm = new GfmAutoComplete(gl.GfmAutoComplete && gl.GfmAutoComplete.dataSources);
|
||||
const enableGFM = convertPermissionToBoolean(el.dataset.supportsAutocomplete);
|
||||
const enableGFM = parseBoolean(el.dataset.supportsAutocomplete);
|
||||
|
||||
gfm.setup($(el), {
|
||||
emojis: true,
|
||||
|
|
|
@ -3,6 +3,7 @@ import syntaxHighlight from '~/syntax_highlight';
|
|||
import renderMath from './render_math';
|
||||
import renderMermaid from './render_mermaid';
|
||||
import highlightCurrentUser from './highlight_current_user';
|
||||
import initUserPopovers from '../../user_popovers';
|
||||
|
||||
// Render GitLab flavoured Markdown
|
||||
//
|
||||
|
@ -13,6 +14,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());
|
||||
return this;
|
||||
};
|
||||
|
||||
|
|
|
@ -50,10 +50,11 @@ function hideOrShowHelpBlock(form) {
|
|||
}
|
||||
|
||||
$(() => {
|
||||
const $form = $('form.js-requires-input');
|
||||
if ($form) {
|
||||
$('form.js-requires-input').each((i, el) => {
|
||||
const $form = $(el);
|
||||
|
||||
$form.requiresInput();
|
||||
hideOrShowHelpBlock($form);
|
||||
$('.select2.js-select-namespace').change(() => hideOrShowHelpBlock($form));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { n__ } from '../locale';
|
||||
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
|
||||
import { parseBoolean } from '../lib/utils/common_utils';
|
||||
|
||||
export default class SecretValues {
|
||||
constructor({
|
||||
|
@ -16,7 +16,7 @@ export default class SecretValues {
|
|||
this.revealButton = this.container.querySelector('.js-secret-value-reveal-button');
|
||||
|
||||
if (this.revealButton) {
|
||||
const isRevealed = convertPermissionToBoolean(this.revealButton.dataset.secretRevealStatus);
|
||||
const isRevealed = parseBoolean(this.revealButton.dataset.secretRevealStatus);
|
||||
this.updateDom(isRevealed);
|
||||
|
||||
this.revealButton.addEventListener('click', this.onRevealButtonClicked.bind(this));
|
||||
|
@ -24,9 +24,7 @@ export default class SecretValues {
|
|||
}
|
||||
|
||||
onRevealButtonClicked() {
|
||||
const previousIsRevealed = convertPermissionToBoolean(
|
||||
this.revealButton.dataset.secretRevealStatus,
|
||||
);
|
||||
const previousIsRevealed = parseBoolean(this.revealButton.dataset.secretRevealStatus);
|
||||
this.updateDom(!previousIsRevealed);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import Mousetrap from 'mousetrap';
|
|||
import axios from '../../lib/utils/axios_utils';
|
||||
import { refreshCurrentPage, visitUrl } from '../../lib/utils/url_utility';
|
||||
import findAndFollowLink from '../../lib/utils/navigation_utility';
|
||||
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||
|
||||
const defaultStopCallback = Mousetrap.stopCallback;
|
||||
Mousetrap.stopCallback = (e, element, combo) => {
|
||||
|
@ -61,7 +62,7 @@ export default class Shortcuts {
|
|||
static onTogglePerfBar(e) {
|
||||
e.preventDefault();
|
||||
const performanceBarCookieName = 'perf_bar_enabled';
|
||||
if (Cookies.get(performanceBarCookieName) === 'true') {
|
||||
if (parseBoolean(Cookies.get(performanceBarCookieName))) {
|
||||
Cookies.set(performanceBarCookieName, 'false', { path: '/' });
|
||||
} else {
|
||||
Cookies.set(performanceBarCookieName, 'true', { path: '/' });
|
||||
|
|
|
@ -4,6 +4,7 @@ import _ from 'underscore';
|
|||
import Sidebar from '../../right_sidebar';
|
||||
import Shortcuts from './shortcuts';
|
||||
import { CopyAsGFM } from '../markdown/copy_as_gfm';
|
||||
import { getSelectedFragment } from '~/lib/utils/common_utils';
|
||||
|
||||
export default class ShortcutsIssuable extends Shortcuts {
|
||||
constructor(isMergeRequest) {
|
||||
|
@ -24,17 +25,43 @@ export default class ShortcutsIssuable extends Shortcuts {
|
|||
|
||||
static replyWithSelectedText() {
|
||||
const $replyField = $('.js-main-target-form .js-vue-comment-form');
|
||||
const documentFragment = window.gl.utils.getSelectedFragment();
|
||||
|
||||
if (!$replyField.length) {
|
||||
if (!$replyField.length || $replyField.is(':hidden') /* Other tab selected in MR */) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const documentFragment = getSelectedFragment(document.querySelector('#content-body'));
|
||||
|
||||
if (!documentFragment) {
|
||||
$replyField.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Sanity check: Make sure the selected text comes from a discussion : it can either contain a message...
|
||||
let foundMessage = !!documentFragment.querySelector('.md, .wiki');
|
||||
|
||||
// ... Or come from a message
|
||||
if (!foundMessage) {
|
||||
if (documentFragment.originalNodes) {
|
||||
documentFragment.originalNodes.forEach(e => {
|
||||
let node = e;
|
||||
do {
|
||||
// Text nodes don't define the `matches` method
|
||||
if (node.matches && node.matches('.md, .wiki')) {
|
||||
foundMessage = true;
|
||||
}
|
||||
node = node.parentNode;
|
||||
} while (node && !foundMessage);
|
||||
});
|
||||
}
|
||||
|
||||
// If there is no message, just select the reply field
|
||||
if (!foundMessage) {
|
||||
$replyField.focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const el = CopyAsGFM.transformGFMSelection(documentFragment.cloneNode(true));
|
||||
const selected = CopyAsGFM.nodeToGFM(el);
|
||||
|
||||
|
|
|
@ -124,7 +124,7 @@ export default class FileTemplateMediator {
|
|||
|
||||
selectTemplateFile(selector, query, data) {
|
||||
selector.renderLoading();
|
||||
// in case undo menu is already already there
|
||||
// in case undo menu is already there
|
||||
this.destroyUndoMenu();
|
||||
this.fetchFileTemplate(selector.config.type, query, data)
|
||||
.then(file => {
|
||||
|
|
|
@ -23,10 +23,12 @@ export default class BlobViewer {
|
|||
if (!viewer || !viewer.dataset.richType) return;
|
||||
|
||||
const initViewer = promise =>
|
||||
promise.then(module => module.default(viewer)).catch(error => {
|
||||
Flash('Error loading file viewer.');
|
||||
throw error;
|
||||
});
|
||||
promise
|
||||
.then(module => module.default(viewer))
|
||||
.catch(error => {
|
||||
Flash('Error loading file viewer.');
|
||||
throw error;
|
||||
});
|
||||
|
||||
switch (viewer.dataset.richType) {
|
||||
case 'balsamiq':
|
||||
|
|
|
@ -16,9 +16,17 @@ export default () => {
|
|||
const filePath = editBlobForm.data('blobFilename');
|
||||
const currentAction = $('.js-file-title').data('currentAction');
|
||||
const projectId = editBlobForm.data('project-id');
|
||||
const commitButton = $('.js-commit-button');
|
||||
|
||||
commitButton.on('click', () => {
|
||||
window.onbeforeunload = null;
|
||||
});
|
||||
|
||||
new EditBlob(`${urlRoot}${assetsPath}`, filePath, currentAction, projectId);
|
||||
new NewCommitForm(editBlobForm);
|
||||
|
||||
// returning here blocks page navigation
|
||||
window.onbeforeunload = () => '';
|
||||
}
|
||||
|
||||
if (uploadBlobForm.length) {
|
||||
|
|
|
@ -61,35 +61,25 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="board-blank-state">
|
||||
<p>
|
||||
Add the following default lists to your Issue Board with one click:
|
||||
</p>
|
||||
<p>Add the following default lists to your Issue Board with one click:</p>
|
||||
<ul class="board-blank-state-list">
|
||||
<li
|
||||
v-for="(label, index) in predefinedLabels"
|
||||
:key="index"
|
||||
>
|
||||
<span
|
||||
:style="{ backgroundColor: label.color }"
|
||||
class="label-color">
|
||||
</span>
|
||||
<li v-for="(label, index) in predefinedLabels" :key="index">
|
||||
<span :style="{ backgroundColor: label.color }" class="label-color"> </span>
|
||||
{{ label.title }}
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Starting out with the default set of lists will get you
|
||||
right on the way to making the most of your board.
|
||||
Starting out with the default set of lists will get you right on the way to making the most of
|
||||
your board.
|
||||
</p>
|
||||
<button
|
||||
class="btn btn-success btn-inverted btn-block"
|
||||
type="button"
|
||||
@click.stop="addDefaultLists">
|
||||
@click.stop="addDefaultLists"
|
||||
>
|
||||
Add default lists
|
||||
</button>
|
||||
<button
|
||||
class="btn btn-default btn-block"
|
||||
type="button"
|
||||
@click.stop="clearBlankState">
|
||||
<button class="btn btn-default btn-block" type="button" @click.stop="clearBlankState">
|
||||
Nevermind, I'll use my own
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -79,14 +79,15 @@ export default {
|
|||
:class="{
|
||||
'user-can-drag': !disabled && issue.id,
|
||||
'is-disabled': disabled || !issue.id,
|
||||
'is-active': issueDetailVisible
|
||||
'is-active': issueDetailVisible,
|
||||
}"
|
||||
:index="index"
|
||||
:data-issue-id="issue.id"
|
||||
class="board-card"
|
||||
@mousedown="mouseDown"
|
||||
@mousemove="mouseMove"
|
||||
@mouseup="showIssue($event)">
|
||||
@mouseup="showIssue($event);"
|
||||
>
|
||||
<issue-card-inner
|
||||
:list="list"
|
||||
:issue="issue"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script>
|
||||
import Sortable from 'sortablejs';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import boardNewIssue from './board_new_issue.vue';
|
||||
import boardCard from './board_card.vue';
|
||||
import eventHub from '../eventhub';
|
||||
|
@ -222,23 +222,22 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="board-list-component">
|
||||
<div
|
||||
v-if="loading"
|
||||
class="board-list-loading text-center"
|
||||
aria-label="Loading issues">
|
||||
<div v-if="loading" class="board-list-loading text-center" aria-label="Loading issues">
|
||||
<gl-loading-icon />
|
||||
</div>
|
||||
<board-new-issue
|
||||
v-if="list.type !== 'closed' && showIssueForm"
|
||||
:group-id="groupId"
|
||||
:list="list"/>
|
||||
:list="list"
|
||||
/>
|
||||
<ul
|
||||
v-show="!loading"
|
||||
ref="list"
|
||||
:data-board="list.id"
|
||||
:data-board-type="list.type"
|
||||
:class="{ 'is-smaller': showIssueForm }"
|
||||
class="board-list js-board-list">
|
||||
class="board-list js-board-list"
|
||||
>
|
||||
<board-card
|
||||
v-for="(issue, index) in issues"
|
||||
ref="issue"
|
||||
|
@ -249,25 +248,12 @@ export default {
|
|||
:issue-link-base="issueLinkBase"
|
||||
:group-id="groupId"
|
||||
:root-path="rootPath"
|
||||
:disabled="disabled" />
|
||||
<li
|
||||
v-if="showCount"
|
||||
class="board-list-count text-center"
|
||||
data-issue-id="-1">
|
||||
<gl-loading-icon
|
||||
v-show="list.loadingMore"
|
||||
label="Loading more issues"
|
||||
/>
|
||||
<span
|
||||
v-if="list.issues.length === list.issuesSize"
|
||||
>
|
||||
Showing all issues
|
||||
</span>
|
||||
<span
|
||||
v-else
|
||||
>
|
||||
Showing {{ list.issues.length }} of {{ list.issuesSize }} issues
|
||||
</span>
|
||||
:disabled="disabled"
|
||||
/>
|
||||
<li v-if="showCount" class="board-list-count text-center" data-issue-id="-1">
|
||||
<gl-loading-icon v-show="list.loadingMore" label="Loading more issues" />
|
||||
<span v-if="list.issues.length === list.issuesSize"> Showing all issues </span>
|
||||
<span v-else> Showing {{ list.issues.length }} of {{ list.issuesSize }} issues </span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script>
|
||||
import $ from 'jquery';
|
||||
import { GlButton } from '@gitlab-org/gitlab-ui';
|
||||
import { GlButton } from '@gitlab/ui';
|
||||
import eventHub from '../eventhub';
|
||||
import ProjectSelect from './project_select.vue';
|
||||
import ListIssue from '../models/issue';
|
||||
|
@ -96,21 +96,11 @@ export default {
|
|||
<template>
|
||||
<div class="board-new-issue-form">
|
||||
<div class="board-card">
|
||||
<form @submit="submit($event)">
|
||||
<div
|
||||
v-if="error"
|
||||
class="flash-container"
|
||||
>
|
||||
<div class="flash-alert">
|
||||
An error occurred. Please try again.
|
||||
</div>
|
||||
<form @submit="submit($event);">
|
||||
<div v-if="error" class="flash-container">
|
||||
<div class="flash-alert">An error occurred. Please try again.</div>
|
||||
</div>
|
||||
<label
|
||||
:for="list.id + '-title'"
|
||||
class="label-bold"
|
||||
>
|
||||
Title
|
||||
</label>
|
||||
<label :for="list.id + '-title'" class="label-bold"> Title </label>
|
||||
<input
|
||||
:id="list.id + '-title'"
|
||||
ref="input"
|
||||
|
@ -120,10 +110,7 @@ export default {
|
|||
name="issue_title"
|
||||
autocomplete="off"
|
||||
/>
|
||||
<project-select
|
||||
v-if="groupId"
|
||||
:group-id="groupId"
|
||||
/>
|
||||
<project-select v-if="groupId" :group-id="groupId" />
|
||||
<div class="clearfix prepend-top-10">
|
||||
<gl-button
|
||||
ref="submit-button"
|
||||
|
@ -134,12 +121,7 @@ export default {
|
|||
>
|
||||
Submit issue
|
||||
</gl-button>
|
||||
<gl-button
|
||||
class="float-right"
|
||||
type="button"
|
||||
variant="default"
|
||||
@click="cancel"
|
||||
>
|
||||
<gl-button class="float-right" type="button" variant="default" @click="cancel">
|
||||
Cancel
|
||||
</gl-button>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { GlTooltipDirective } from '@gitlab-org/gitlab-ui';
|
||||
import { GlTooltipDirective } from '@gitlab/ui';
|
||||
import { sprintf, __ } from '~/locale';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import TooltipOnTruncate from '~/vue_shared/components/tooltip_on_truncate.vue';
|
||||
|
@ -169,17 +169,12 @@ export default {
|
|||
:title="__('Confidential')"
|
||||
class="confidential-icon append-right-4"
|
||||
:aria-label="__('Confidential')"
|
||||
/><a
|
||||
:href="issue.path"
|
||||
:title="issue.title"
|
||||
class="js-no-trigger"
|
||||
@mousemove.stop>{{ issue.title }}</a>
|
||||
/><a :href="issue.path" :title="issue.title" class="js-no-trigger" @mousemove.stop>{{
|
||||
issue.title
|
||||
}}</a>
|
||||
</h4>
|
||||
</div>
|
||||
<div
|
||||
v-if="showLabelFooter"
|
||||
class="board-card-labels prepend-top-4 d-flex flex-wrap"
|
||||
>
|
||||
<div v-if="showLabelFooter" class="board-card-labels prepend-top-4 d-flex flex-wrap">
|
||||
<button
|
||||
v-for="label in issue.labels"
|
||||
v-if="showLabel(label)"
|
||||
|
@ -189,13 +184,15 @@ export default {
|
|||
:title="label.description"
|
||||
class="badge color-label append-right-4 prepend-top-4"
|
||||
type="button"
|
||||
@click="filterByLabel(label)"
|
||||
@click="filterByLabel(label);"
|
||||
>
|
||||
{{ label.title }}
|
||||
</button>
|
||||
</div>
|
||||
<div class="board-card-footer d-flex justify-content-between align-items-end">
|
||||
<div class="d-flex align-items-start flex-wrap-reverse board-card-number-container js-board-card-number-container">
|
||||
<div
|
||||
class="d-flex align-items-start flex-wrap-reverse board-card-number-container js-board-card-number-container"
|
||||
>
|
||||
<span
|
||||
v-if="issue.referencePath"
|
||||
class="board-card-number d-flex append-right-8 prepend-top-8"
|
||||
|
@ -205,13 +202,11 @@ export default {
|
|||
:title="issueReferencePath"
|
||||
placement="bottom"
|
||||
class="board-issue-path block-truncated bold"
|
||||
>{{ issueReferencePath }}</tooltip-on-truncate>#{{ issue.iid }}
|
||||
>{{ issueReferencePath }}</tooltip-on-truncate
|
||||
>#{{ issue.iid }}
|
||||
</span>
|
||||
<span class="board-info-items prepend-top-8 d-inline-block">
|
||||
<issue-due-date
|
||||
v-if="issue.dueDate"
|
||||
:date="issue.dueDate"
|
||||
/><issue-time-estimate
|
||||
<issue-due-date v-if="issue.dueDate" :date="issue.dueDate" /><issue-time-estimate
|
||||
v-if="issue.timeEstimate"
|
||||
:estimate="issue.timeEstimate"
|
||||
/>
|
||||
|
@ -230,8 +225,7 @@ export default {
|
|||
tooltip-placement="bottom"
|
||||
>
|
||||
<span class="js-assignee-tooltip">
|
||||
<span class="bold d-block">Assignee</span>
|
||||
{{ assignee.name }}
|
||||
<span class="bold d-block">Assignee</span> {{ assignee.name }}
|
||||
<span class="text-white-50">@{{ assignee.username }}</span>
|
||||
</span>
|
||||
</user-avatar-link>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script>
|
||||
import dateFormat from 'dateformat';
|
||||
import { GlTooltip } from '@gitlab-org/gitlab-ui';
|
||||
import { GlTooltip } from '@gitlab/ui';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { __ } from '~/locale';
|
||||
import { getDayDifference, getTimeago, dateInWords } from '~/lib/utils/datetime_utility';
|
||||
|
@ -15,6 +15,16 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
cssClass: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
tooltipPlacement: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'bottom',
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
title() {
|
||||
|
@ -66,25 +76,15 @@ export default {
|
|||
|
||||
<template>
|
||||
<span>
|
||||
<span
|
||||
ref="issueDueDate"
|
||||
class="board-card-info card-number"
|
||||
>
|
||||
<icon
|
||||
:class="{'text-danger': isPastDue, 'board-card-info-icon': true}"
|
||||
name="calendar"
|
||||
/><time
|
||||
:class="{'text-danger': isPastDue}"
|
||||
datetime="date"
|
||||
class="board-card-info-text">{{ body }}</time>
|
||||
<span ref="issueDueDate" :class="cssClass" class="board-card-info card-number">
|
||||
<icon :class="{ 'text-danger': isPastDue, 'board-card-info-icon': true }" name="calendar" />
|
||||
<time :class="{ 'text-danger': isPastDue }" datetime="date" class="board-card-info-text">{{
|
||||
body
|
||||
}}</time>
|
||||
</span>
|
||||
<gl-tooltip
|
||||
:target="() => $refs.issueDueDate"
|
||||
placement="bottom"
|
||||
>
|
||||
<span class="bold">{{ __('Due date') }}</span>
|
||||
<br />
|
||||
<span :class="{'text-danger-muted': isPastDue}">{{ title }}</span>
|
||||
<gl-tooltip :target="() => $refs.issueDueDate" :placement="tooltipPlacement">
|
||||
<span class="bold">{{ __('Due date') }}</span> <br />
|
||||
<span :class="{ 'text-danger-muted': isPastDue }">{{ title }}</span>
|
||||
</gl-tooltip>
|
||||
</span>
|
||||
</template>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { GlTooltip } from '@gitlab-org/gitlab-ui';
|
||||
import { GlTooltip } from '@gitlab/ui';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { parseSeconds, stringifyTime } from '~/lib/utils/datetime_utility';
|
||||
|
||||
|
@ -27,22 +27,18 @@ export default {
|
|||
|
||||
<template>
|
||||
<span>
|
||||
<span
|
||||
ref="issueTimeEstimate"
|
||||
class="board-card-info card-number"
|
||||
>
|
||||
<icon
|
||||
name="hourglass"
|
||||
css-classes="board-card-info-icon"
|
||||
/><time class="board-card-info-text">{{ timeEstimate }}</time>
|
||||
<span ref="issueTimeEstimate" class="board-card-info card-number">
|
||||
<icon name="hourglass" css-classes="board-card-info-icon" /><time
|
||||
class="board-card-info-text"
|
||||
>{{ timeEstimate }}</time
|
||||
>
|
||||
</span>
|
||||
<gl-tooltip
|
||||
:target="() => $refs.issueTimeEstimate"
|
||||
placement="bottom"
|
||||
class="js-issue-time-estimate"
|
||||
>
|
||||
<span class="bold d-block">{{ __('Time estimate') }}</span>
|
||||
{{ title }}
|
||||
<span class="bold d-block">{{ __('Time estimate') }}</span> {{ title }}
|
||||
</gl-tooltip>
|
||||
</span>
|
||||
</template>
|
||||
|
|
|
@ -45,24 +45,20 @@ export default {
|
|||
<section class="empty-state">
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-6 order-md-last">
|
||||
<aside class="svg-content"><img :src="emptyStateSvg"/></aside>
|
||||
<aside class="svg-content"><img :src="emptyStateSvg" /></aside>
|
||||
</div>
|
||||
<div class="col-12 col-md-6 order-md-first">
|
||||
<div class="text-content">
|
||||
<h4>{{ contents.title }}</h4>
|
||||
<p v-html="contents.content"></p>
|
||||
<a
|
||||
v-if="activeTab === 'all'"
|
||||
:href="newIssuePath"
|
||||
class="btn btn-success btn-inverted"
|
||||
>
|
||||
<a v-if="activeTab === 'all'" :href="newIssuePath" class="btn btn-success btn-inverted">
|
||||
New issue
|
||||
</a>
|
||||
<button
|
||||
v-if="activeTab === 'selected'"
|
||||
class="btn btn-default"
|
||||
type="button"
|
||||
@click="changeTab('all')"
|
||||
@click="changeTab('all');"
|
||||
>
|
||||
Open issues
|
||||
</button>
|
||||
|
|
|
@ -63,28 +63,15 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<footer
|
||||
class="form-actions add-issues-footer"
|
||||
>
|
||||
<footer class="form-actions add-issues-footer">
|
||||
<div class="float-left">
|
||||
<button
|
||||
:disabled="submitDisabled"
|
||||
class="btn btn-success"
|
||||
type="button"
|
||||
@click="addIssues"
|
||||
>
|
||||
<button :disabled="submitDisabled" class="btn btn-success" type="button" @click="addIssues">
|
||||
{{ submitText }}
|
||||
</button>
|
||||
<span class="inline add-issues-footer-to-list">
|
||||
to list
|
||||
</span>
|
||||
<lists-dropdown/>
|
||||
<span class="inline add-issues-footer-to-list"> to list </span>
|
||||
<lists-dropdown />
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-default float-right"
|
||||
type="button"
|
||||
@click="toggleModal(false)"
|
||||
>
|
||||
<button class="btn btn-default float-right" type="button" @click="toggleModal(false);">
|
||||
Cancel
|
||||
</button>
|
||||
</footer>
|
||||
|
|
|
@ -58,16 +58,14 @@ export default {
|
|||
class="close"
|
||||
data-dismiss="modal"
|
||||
aria-label="Close"
|
||||
@click="toggleModal(false)"
|
||||
@click="toggleModal(false);"
|
||||
>
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</h2>
|
||||
</header>
|
||||
<modal-tabs v-if="!loading && issuesCount > 0"/>
|
||||
<div
|
||||
v-if="showSearch"
|
||||
class="add-issues-search append-bottom-10">
|
||||
<modal-tabs v-if="!loading && issuesCount > 0" />
|
||||
<div v-if="showSearch" class="add-issues-search append-bottom-10">
|
||||
<modal-filters :store="filter" />
|
||||
<button
|
||||
ref="selectAllBtn"
|
||||
|
|
|
@ -6,7 +6,7 @@ import ModalList from './list.vue';
|
|||
import ModalFooter from './footer.vue';
|
||||
import EmptyState from './empty_state.vue';
|
||||
import ModalStore from '../../stores/modal_store';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -143,9 +143,7 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<div
|
||||
v-if="showAddIssuesModal"
|
||||
class="add-issues-modal">
|
||||
<div v-if="showAddIssuesModal" class="add-issues-modal">
|
||||
<div class="add-issues-container">
|
||||
<modal-header
|
||||
:project-id="projectId"
|
||||
|
@ -163,15 +161,10 @@ export default {
|
|||
:new-issue-path="newIssuePath"
|
||||
:empty-state-svg="emptyStateSvg"
|
||||
/>
|
||||
<section
|
||||
v-if="loading || filterLoading"
|
||||
class="add-issues-list text-center"
|
||||
>
|
||||
<div class="add-issues-list-loading">
|
||||
<gl-loading-icon />
|
||||
</div>
|
||||
<section v-if="loading || filterLoading" class="add-issues-list text-center">
|
||||
<div class="add-issues-list-loading"><gl-loading-icon /></div>
|
||||
</section>
|
||||
<modal-footer/>
|
||||
<modal-footer />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -117,38 +117,22 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<section
|
||||
ref="list"
|
||||
class="add-issues-list add-issues-list-columns">
|
||||
<section ref="list" class="add-issues-list add-issues-list-columns">
|
||||
<div
|
||||
v-if="issuesCount > 0 && issues.length === 0"
|
||||
class="empty-state add-issues-empty-state-filter text-center">
|
||||
<div class="svg-content">
|
||||
<img :src="emptyStateSvg" />
|
||||
</div>
|
||||
<div class="text-content">
|
||||
<h4>
|
||||
There are no issues to show.
|
||||
</h4>
|
||||
</div>
|
||||
class="empty-state add-issues-empty-state-filter text-center"
|
||||
>
|
||||
<div class="svg-content"><img :src="emptyStateSvg" /></div>
|
||||
<div class="text-content"><h4>There are no issues to show.</h4></div>
|
||||
</div>
|
||||
<div
|
||||
v-for="(group, index) in groupedIssues"
|
||||
:key="index"
|
||||
class="add-issues-list-column">
|
||||
<div
|
||||
v-for="issue in group"
|
||||
v-if="showIssue(issue)"
|
||||
:key="issue.id"
|
||||
class="board-card-parent">
|
||||
<div v-for="(group, index) in groupedIssues" :key="index" class="add-issues-list-column">
|
||||
<div v-for="issue in group" v-if="showIssue(issue)" :key="issue.id" class="board-card-parent">
|
||||
<div
|
||||
:class="{ 'is-active': issue.selected }"
|
||||
class="board-card"
|
||||
@click="toggleIssue($event, issue)">
|
||||
<issue-card-inner
|
||||
:issue="issue"
|
||||
:issue-link-base="issueLinkBase"
|
||||
:root-path="rootPath"/>
|
||||
@click="toggleIssue($event, issue);"
|
||||
>
|
||||
<issue-card-inner :issue="issue" :issue-link-base="issueLinkBase" :root-path="rootPath" />
|
||||
<icon
|
||||
v-if="issue.selected"
|
||||
:aria-label="'Issue #' + issue.id + ' selected'"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { GlLink } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLink } from '@gitlab/ui';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import ModalStore from '../../stores/modal_store';
|
||||
import boardsStore from '../../stores/boards_store';
|
||||
|
@ -27,35 +27,20 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<div class="dropdown inline">
|
||||
<button
|
||||
class="dropdown-menu-toggle"
|
||||
type="button"
|
||||
data-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
<span
|
||||
:style="{ backgroundColor: selected.label.color }"
|
||||
class="dropdown-label-box">
|
||||
</span>
|
||||
{{ selected.title }}
|
||||
<icon
|
||||
name="chevron-down"
|
||||
/>
|
||||
<button class="dropdown-menu-toggle" type="button" data-toggle="dropdown" aria-expanded="false">
|
||||
<span :style="{ backgroundColor: selected.label.color }" class="dropdown-label-box"> </span>
|
||||
{{ selected.title }} <icon name="chevron-down" />
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-selectable dropdown-menu-drop-up">
|
||||
<ul>
|
||||
<li
|
||||
v-for="(list, i) in state.lists"
|
||||
v-if="list.type == 'label'"
|
||||
:key="i">
|
||||
<li v-for="(list, i) in state.lists" v-if="list.type == 'label'" :key="i">
|
||||
<gl-link
|
||||
:class="{ 'is-active': list.id == selected.id }"
|
||||
href="#"
|
||||
role="button"
|
||||
@click.prevent="modal.selectedList = list">
|
||||
<span
|
||||
:style="{ backgroundColor: list.label.color }"
|
||||
class="dropdown-label-box">
|
||||
</span>
|
||||
@click.prevent="modal.selectedList = list;"
|
||||
>
|
||||
<span :style="{ backgroundColor: list.label.color }" class="dropdown-label-box"> </span>
|
||||
{{ list.title }}
|
||||
</gl-link>
|
||||
</li>
|
||||
|
|
|
@ -20,28 +20,14 @@ export default {
|
|||
<template>
|
||||
<div class="top-area prepend-top-10 append-bottom-10">
|
||||
<ul class="nav-links issues-state-filters">
|
||||
<li :class="{ 'active': activeTab == 'all' }">
|
||||
<a
|
||||
href="#"
|
||||
role="button"
|
||||
@click.prevent="changeTab('all')"
|
||||
>
|
||||
Open issues
|
||||
<span class="badge badge-pill">
|
||||
{{ issuesCount }}
|
||||
</span>
|
||||
<li :class="{ active: activeTab == 'all' }">
|
||||
<a href="#" role="button" @click.prevent="changeTab('all');">
|
||||
Open issues <span class="badge badge-pill"> {{ issuesCount }} </span>
|
||||
</a>
|
||||
</li>
|
||||
<li :class="{ 'active': activeTab == 'selected' }">
|
||||
<a
|
||||
href="#"
|
||||
role="button"
|
||||
@click.prevent="changeTab('selected')"
|
||||
>
|
||||
Selected issues
|
||||
<span class="badge badge-pill">
|
||||
{{ selectedCount }}
|
||||
</span>
|
||||
<li :class="{ active: activeTab == 'selected' }">
|
||||
<a href="#" role="button" @click.prevent="changeTab('selected');">
|
||||
Selected issues <span class="badge badge-pill"> {{ selectedCount }} </span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
import $ from 'jquery';
|
||||
import _ from 'underscore';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import eventHub from '../eventhub';
|
||||
import Api from '../../api';
|
||||
|
||||
|
@ -48,10 +48,19 @@ export default {
|
|||
selectable: true,
|
||||
data: (term, callback) => {
|
||||
this.loading = true;
|
||||
return Api.groupProjects(this.groupId, term, { with_issues_enabled: true }, projects => {
|
||||
this.loading = false;
|
||||
callback(projects);
|
||||
});
|
||||
return Api.groupProjects(
|
||||
this.groupId,
|
||||
term,
|
||||
{
|
||||
with_issues_enabled: true,
|
||||
with_shared: false,
|
||||
include_subgroups: true,
|
||||
},
|
||||
projects => {
|
||||
this.loading = false;
|
||||
callback(projects);
|
||||
},
|
||||
);
|
||||
},
|
||||
renderRow(project) {
|
||||
return `
|
||||
|
@ -72,55 +81,24 @@ export default {
|
|||
|
||||
<template>
|
||||
<div>
|
||||
<label class="label-bold prepend-top-10">
|
||||
Project
|
||||
</label>
|
||||
<div
|
||||
ref="projectsDropdown"
|
||||
class="dropdown"
|
||||
>
|
||||
<label class="label-bold prepend-top-10"> Project </label>
|
||||
<div ref="projectsDropdown" class="dropdown">
|
||||
<button
|
||||
class="dropdown-menu-toggle wide"
|
||||
type="button"
|
||||
data-toggle="dropdown"
|
||||
aria-expanded="false"
|
||||
>
|
||||
{{ selectedProjectName }}
|
||||
<icon
|
||||
name="chevron-down"
|
||||
/>
|
||||
{{ selectedProjectName }} <icon name="chevron-down" />
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-selectable dropdown-menu-full-width">
|
||||
<div class="dropdown-title">
|
||||
<span>Projects</span>
|
||||
<button
|
||||
aria-label="Close"
|
||||
type="button"
|
||||
class="dropdown-title-button dropdown-menu-close"
|
||||
>
|
||||
<icon
|
||||
name="merge-request-close-m"
|
||||
data-hidden="true"
|
||||
class="dropdown-menu-close-icon"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
<div class="dropdown-title">Projects</div>
|
||||
<div class="dropdown-input">
|
||||
<input
|
||||
class="dropdown-input-field"
|
||||
type="search"
|
||||
placeholder="Search projects"
|
||||
/>
|
||||
<icon
|
||||
name="search"
|
||||
class="dropdown-input-search"
|
||||
data-hidden="true"
|
||||
/>
|
||||
<input class="dropdown-input-field" type="search" placeholder="Search projects" />
|
||||
<icon name="search" class="dropdown-input-search" data-hidden="true" />
|
||||
</div>
|
||||
<div class="dropdown-content"></div>
|
||||
<div class="dropdown-loading">
|
||||
<gl-loading-icon />
|
||||
</div>
|
||||
<div class="dropdown-loading"><gl-loading-icon /></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -74,14 +74,8 @@ export default Vue.extend({
|
|||
});
|
||||
</script>
|
||||
<template>
|
||||
<div
|
||||
class="block list"
|
||||
>
|
||||
<button
|
||||
class="btn btn-default btn-block"
|
||||
type="button"
|
||||
@click="removeIssue"
|
||||
>
|
||||
<div class="block list">
|
||||
<button class="btn btn-default btn-block" type="button" @click="removeIssue">
|
||||
Remove from board
|
||||
</button>
|
||||
</div>
|
||||
|
|
|
@ -24,7 +24,7 @@ import BoardSidebar from './components/board_sidebar';
|
|||
import initNewListDropdown from './components/new_list_dropdown';
|
||||
import BoardAddIssuesModal from './components/modal/index.vue';
|
||||
import '~/vue_shared/vue_resource_interceptor';
|
||||
import { NavigationType } from '~/lib/utils/common_utils';
|
||||
import { NavigationType, parseBoolean } from '~/lib/utils/common_utils';
|
||||
|
||||
let issueBoardsApp;
|
||||
|
||||
|
@ -60,7 +60,7 @@ export default () => {
|
|||
boardsEndpoint: $boardApp.dataset.boardsEndpoint,
|
||||
listsEndpoint: $boardApp.dataset.listsEndpoint,
|
||||
boardId: $boardApp.dataset.boardId,
|
||||
disabled: $boardApp.dataset.disabled === 'true',
|
||||
disabled: parseBoolean($boardApp.dataset.disabled),
|
||||
issueLinkBase: $boardApp.dataset.issueLinkBase,
|
||||
rootPath: $boardApp.dataset.rootPath,
|
||||
bulkUpdatePath: $boardApp.dataset.bulkUpdatePath,
|
||||
|
|
|
@ -5,7 +5,7 @@ import $ from 'jquery';
|
|||
import _ from 'underscore';
|
||||
import Vue from 'vue';
|
||||
import Cookies from 'js-cookie';
|
||||
import { getUrlParamsArray } from '~/lib/utils/common_utils';
|
||||
import { getUrlParamsArray, parseBoolean } from '~/lib/utils/common_utils';
|
||||
|
||||
const boardsStore = {
|
||||
disabled: false,
|
||||
|
@ -78,7 +78,7 @@ const boardsStore = {
|
|||
});
|
||||
},
|
||||
welcomeIsHidden() {
|
||||
return Cookies.get('issue_board_welcome_hidden') === 'true';
|
||||
return parseBoolean(Cookies.get('issue_board_welcome_hidden'));
|
||||
},
|
||||
removeList(id, type = 'blank') {
|
||||
const list = this.findList('id', id, type);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import $ from 'jquery';
|
||||
import { visitUrl } from './lib/utils/url_utility';
|
||||
import { convertPermissionToBoolean } from './lib/utils/common_utils';
|
||||
import { parseBoolean } from './lib/utils/common_utils';
|
||||
|
||||
export default class BuildArtifacts {
|
||||
constructor() {
|
||||
|
@ -22,7 +22,7 @@ export default class BuildArtifacts {
|
|||
// eslint-disable-next-line class-methods-use-this
|
||||
setupEntryClick() {
|
||||
return $('.tree-holder').on('click', 'tr[data-link]', function() {
|
||||
visitUrl(this.dataset.link, convertPermissionToBoolean(this.dataset.externalLink));
|
||||
visitUrl(this.dataset.link, parseBoolean(this.dataset.externalLink));
|
||||
});
|
||||
}
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
|
|
|
@ -2,7 +2,7 @@ import _ from 'underscore';
|
|||
import axios from '../lib/utils/axios_utils';
|
||||
import { s__ } from '../locale';
|
||||
import Flash from '../flash';
|
||||
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
|
||||
import { parseBoolean } from '../lib/utils/common_utils';
|
||||
import statusCodes from '../lib/utils/http_status';
|
||||
import VariableList from './ci_variable_list';
|
||||
|
||||
|
@ -84,7 +84,7 @@ export default class AjaxVariableList {
|
|||
.catch(() => {
|
||||
loadingIcon.classList.toggle('hide', true);
|
||||
this.variableList.toggleEnableRow(true);
|
||||
Flash(s__('CiVariable|Error occured while saving variables'));
|
||||
Flash(s__('CiVariable|Error occurred while saving variables'));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ export default class AjaxVariableList {
|
|||
// If we submitted a row that was destroyed, remove it so we don't try
|
||||
// to destroy it again which would cause a BE error
|
||||
const destroyInput = row.querySelector('.js-ci-variable-input-destroy');
|
||||
if (convertPermissionToBoolean(destroyInput.value)) {
|
||||
if (parseBoolean(destroyInput.value)) {
|
||||
row.remove();
|
||||
// Update the ID input so any future edits and `_destroy` will apply on the BE
|
||||
} else {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import $ from 'jquery';
|
||||
import { convertPermissionToBoolean } from '../lib/utils/common_utils';
|
||||
import { parseBoolean } from '../lib/utils/common_utils';
|
||||
import { s__ } from '../locale';
|
||||
import setupToggleButtons from '../toggle_buttons';
|
||||
import CreateItemDropdown from '../create_item_dropdown';
|
||||
|
@ -150,7 +150,7 @@ export default class VariableList {
|
|||
|
||||
removeRow(row) {
|
||||
const $row = $(row);
|
||||
const isPersisted = convertPermissionToBoolean($row.attr('data-is-persisted'));
|
||||
const isPersisted = parseBoolean($row.attr('data-is-persisted'));
|
||||
|
||||
if (isPersisted) {
|
||||
$row.hide();
|
||||
|
|
|
@ -9,7 +9,7 @@ import eventHub from './event_hub';
|
|||
import { APPLICATION_STATUS, REQUEST_LOADING, REQUEST_SUCCESS, REQUEST_FAILURE } from './constants';
|
||||
import ClustersService from './services/clusters_service';
|
||||
import ClustersStore from './stores/clusters_store';
|
||||
import applications from './components/applications.vue';
|
||||
import Applications from './components/applications.vue';
|
||||
import setupToggleButtons from '../toggle_buttons';
|
||||
|
||||
/**
|
||||
|
@ -26,11 +26,13 @@ export default class Clusters {
|
|||
statusPath,
|
||||
installHelmPath,
|
||||
installIngressPath,
|
||||
installCertManagerPath,
|
||||
installRunnerPath,
|
||||
installJupyterPath,
|
||||
installKnativePath,
|
||||
installPrometheusPath,
|
||||
managePrometheusPath,
|
||||
clusterType,
|
||||
clusterStatus,
|
||||
clusterStatusReason,
|
||||
helpPath,
|
||||
|
@ -47,6 +49,7 @@ export default class Clusters {
|
|||
endpoint: statusPath,
|
||||
installHelmEndpoint: installHelmPath,
|
||||
installIngressEndpoint: installIngressPath,
|
||||
installCertManagerEndpoint: installCertManagerPath,
|
||||
installRunnerEndpoint: installRunnerPath,
|
||||
installPrometheusEndpoint: installPrometheusPath,
|
||||
installJupyterEndpoint: installJupyterPath,
|
||||
|
@ -67,7 +70,7 @@ export default class Clusters {
|
|||
initDismissableCallout('.js-cluster-security-warning');
|
||||
initSettingsPanels();
|
||||
setupToggleButtons(document.querySelector('.js-cluster-enable-toggle-area'));
|
||||
this.initApplications();
|
||||
this.initApplications(clusterType);
|
||||
|
||||
if (this.store.state.status !== 'created') {
|
||||
this.updateContainer(null, this.store.state.status, this.store.state.statusReason);
|
||||
|
@ -79,23 +82,21 @@ export default class Clusters {
|
|||
}
|
||||
}
|
||||
|
||||
initApplications() {
|
||||
initApplications(type) {
|
||||
const { store } = this;
|
||||
const el = document.querySelector('#js-cluster-applications');
|
||||
|
||||
this.applications = new Vue({
|
||||
el,
|
||||
components: {
|
||||
applications,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
state: store.state,
|
||||
};
|
||||
},
|
||||
render(createElement) {
|
||||
return createElement('applications', {
|
||||
return createElement(Applications, {
|
||||
props: {
|
||||
type,
|
||||
applications: this.state.applications,
|
||||
helpPath: this.state.helpPath,
|
||||
ingressHelpPath: this.state.ingressHelpPath,
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
import createFlash from '~/flash';
|
||||
import { __ } from '~/locale';
|
||||
import setupToggleButtons from '~/toggle_buttons';
|
||||
import initDismissableCallout from '~/dismissable_callout';
|
||||
|
||||
import ClustersService from './services/clusters_service';
|
||||
|
||||
export default () => {
|
||||
const clusterList = document.querySelector('.js-clusters-list');
|
||||
|
||||
initDismissableCallout('.gcp-signup-offer');
|
||||
|
||||
// The empty state won't have a clusterList
|
||||
if (clusterList) {
|
||||
setupToggleButtons(document.querySelector('.js-clusters-list'), (value, toggle) =>
|
||||
ClustersService.updateCluster(toggle.dataset.endpoint, { cluster: { enabled: value } }).catch(
|
||||
err => {
|
||||
createFlash(__('Something went wrong on our end.'));
|
||||
throw err;
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
};
|
|
@ -164,35 +164,21 @@ export default {
|
|||
:class="[
|
||||
rowJsClass,
|
||||
isInstalled && 'cluster-application-installed',
|
||||
disabled && 'cluster-application-disabled'
|
||||
disabled && 'cluster-application-disabled',
|
||||
]"
|
||||
class="cluster-application-row gl-responsive-table-row gl-responsive-table-row-col-span"
|
||||
>
|
||||
<div
|
||||
class="gl-responsive-table-row-layout"
|
||||
role="row"
|
||||
>
|
||||
<div
|
||||
class="table-section append-right-8 section-align-top"
|
||||
role="gridcell"
|
||||
>
|
||||
<div class="gl-responsive-table-row-layout" role="row">
|
||||
<div class="table-section append-right-8 section-align-top" role="gridcell">
|
||||
<img
|
||||
v-if="hasLogo"
|
||||
:src="logoUrl"
|
||||
:alt="`${title} logo`"
|
||||
class="cluster-application-logo avatar s40"
|
||||
/>
|
||||
<identicon
|
||||
v-else
|
||||
:entity-id="identiconId"
|
||||
:entity-name="title"
|
||||
size-class="s40"
|
||||
/>
|
||||
<identicon v-else :entity-id="identiconId" :entity-name="title" size-class="s40" />
|
||||
</div>
|
||||
<div
|
||||
class="table-section cluster-application-description section-wrap"
|
||||
role="gridcell"
|
||||
>
|
||||
<div class="table-section cluster-application-description section-wrap" role="gridcell">
|
||||
<strong>
|
||||
<a
|
||||
v-if="titleLink"
|
||||
|
@ -203,12 +189,7 @@ export default {
|
|||
>
|
||||
{{ title }}
|
||||
</a>
|
||||
<span
|
||||
v-else
|
||||
class="js-cluster-application-title"
|
||||
>
|
||||
{{ title }}
|
||||
</span>
|
||||
<span v-else class="js-cluster-application-title"> {{ title }} </span>
|
||||
</strong>
|
||||
<slot name="description"></slot>
|
||||
<div
|
||||
|
@ -219,16 +200,10 @@ export default {
|
|||
{{ generalErrorDescription }}
|
||||
</p>
|
||||
<ul v-if="statusReason || requestReason">
|
||||
<li
|
||||
v-if="statusReason"
|
||||
class="js-cluster-application-status-error-message"
|
||||
>
|
||||
<li v-if="statusReason" class="js-cluster-application-status-error-message">
|
||||
{{ statusReason }}
|
||||
</li>
|
||||
<li
|
||||
v-if="requestReason"
|
||||
class="js-cluster-application-request-error-message"
|
||||
>
|
||||
<li v-if="requestReason" class="js-cluster-application-request-error-message">
|
||||
{{ requestReason }}
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -239,15 +214,8 @@ export default {
|
|||
class="table-section table-button-footer section-align-top"
|
||||
role="gridcell"
|
||||
>
|
||||
<div
|
||||
v-if="showManageButton"
|
||||
class="btn-group table-action-buttons"
|
||||
>
|
||||
<a
|
||||
:href="manageLink"
|
||||
:class="{ disabled: disabled }"
|
||||
class="btn"
|
||||
>
|
||||
<div v-if="showManageButton" class="btn-group table-action-buttons">
|
||||
<a :href="manageLink" :class="{ disabled: disabled }" class="btn">
|
||||
{{ manageButtonLabel }}
|
||||
</a>
|
||||
</div>
|
||||
|
|
|
@ -7,13 +7,14 @@ import helmLogo from 'images/cluster_app_logos/helm.png';
|
|||
import jeagerLogo from 'images/cluster_app_logos/jeager.png';
|
||||
import jupyterhubLogo from 'images/cluster_app_logos/jupyterhub.png';
|
||||
import kubernetesLogo from 'images/cluster_app_logos/kubernetes.png';
|
||||
import certManagerLogo from 'images/cluster_app_logos/cert_manager.png';
|
||||
import knativeLogo from 'images/cluster_app_logos/knative.png';
|
||||
import meltanoLogo from 'images/cluster_app_logos/meltano.png';
|
||||
import prometheusLogo from 'images/cluster_app_logos/prometheus.png';
|
||||
import { s__, sprintf } from '../../locale';
|
||||
import applicationRow from './application_row.vue';
|
||||
import clipboardButton from '../../vue_shared/components/clipboard_button.vue';
|
||||
import { APPLICATION_STATUS, INGRESS } from '../constants';
|
||||
import { CLUSTER_TYPE, APPLICATION_STATUS, INGRESS } from '../constants';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -21,6 +22,11 @@ export default {
|
|||
clipboardButton,
|
||||
},
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: CLUSTER_TYPE.PROJECT,
|
||||
},
|
||||
applications: {
|
||||
type: Object,
|
||||
required: false,
|
||||
|
@ -54,11 +60,15 @@ export default {
|
|||
jeagerLogo,
|
||||
jupyterhubLogo,
|
||||
kubernetesLogo,
|
||||
certManagerLogo,
|
||||
knativeLogo,
|
||||
meltanoLogo,
|
||||
prometheusLogo,
|
||||
}),
|
||||
computed: {
|
||||
isProjectCluster() {
|
||||
return this.type === CLUSTER_TYPE.PROJECT;
|
||||
},
|
||||
helmInstalled() {
|
||||
return (
|
||||
this.applications.helm.status === APPLICATION_STATUS.INSTALLED ||
|
||||
|
@ -74,6 +84,9 @@ export default {
|
|||
ingressExternalIp() {
|
||||
return this.applications.ingress.externalIp;
|
||||
},
|
||||
certManagerInstalled() {
|
||||
return this.applications.cert_manager.status === APPLICATION_STATUS.INSTALLED;
|
||||
},
|
||||
ingressDescription() {
|
||||
const extraCostParagraph = sprintf(
|
||||
_.escape(
|
||||
|
@ -116,6 +129,23 @@ export default {
|
|||
</p>
|
||||
`;
|
||||
},
|
||||
certManagerDescription() {
|
||||
return sprintf(
|
||||
_.escape(
|
||||
s__(
|
||||
`ClusterIntegration|Cert-Manager is a native Kubernetes certificate management controller that helps with issuing certificates.
|
||||
Installing Cert-Manager on your cluster will issue a certificate by %{letsEncrypt} and ensure that certificates
|
||||
are valid and up-to-date.`,
|
||||
),
|
||||
),
|
||||
{
|
||||
letsEncrypt: `<a href="https://letsencrypt.org/"
|
||||
target="_blank" rel="noopener noreferrer">
|
||||
${_.escape(s__("ClusterIntegration|Let's Encrypt"))}</a>`,
|
||||
},
|
||||
false,
|
||||
);
|
||||
},
|
||||
prometheusDescription() {
|
||||
return sprintf(
|
||||
_.escape(
|
||||
|
@ -141,6 +171,9 @@ export default {
|
|||
knativeInstalled() {
|
||||
return this.applications.knative.status === APPLICATION_STATUS.INSTALLED;
|
||||
},
|
||||
knativeExternalIp() {
|
||||
return this.applications.knative.externalIp;
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.helmInstallIllustration = helmInstallIllustration;
|
||||
|
@ -150,15 +183,13 @@ export default {
|
|||
|
||||
<template>
|
||||
<section id="cluster-applications">
|
||||
<h4>
|
||||
{{ s__('ClusterIntegration|Applications') }}
|
||||
</h4>
|
||||
<h4>{{ s__('ClusterIntegration|Applications') }}</h4>
|
||||
<p class="append-bottom-0">
|
||||
{{ s__(`ClusterIntegration|Choose which applications to install on your Kubernetes cluster.
|
||||
Helm Tiller is required to install any of the following applications.`) }}
|
||||
<a :href="helpPath">
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
{{
|
||||
s__(`ClusterIntegration|Choose which applications to install on your Kubernetes cluster.
|
||||
Helm Tiller is required to install any of the following applications.`)
|
||||
}}
|
||||
<a :href="helpPath"> {{ __('More information') }} </a>
|
||||
</p>
|
||||
|
||||
<div class="cluster-application-list prepend-top-10">
|
||||
|
@ -174,23 +205,20 @@ export default {
|
|||
title-link="https://docs.helm.sh/"
|
||||
>
|
||||
<div slot="description">
|
||||
{{ s__(`ClusterIntegration|Helm streamlines installing
|
||||
{{
|
||||
s__(`ClusterIntegration|Helm streamlines installing
|
||||
and managing Kubernetes applications.
|
||||
Tiller runs inside of your Kubernetes Cluster,
|
||||
and manages releases of your charts.`) }}
|
||||
and manages releases of your charts.`)
|
||||
}}
|
||||
</div>
|
||||
</application-row>
|
||||
<div
|
||||
v-show="!helmInstalled"
|
||||
class="cluster-application-warning"
|
||||
>
|
||||
<div
|
||||
class="svg-container"
|
||||
v-html="helmInstallIllustration"
|
||||
>
|
||||
</div>
|
||||
{{ s__(`ClusterIntegration|You must first install Helm Tiller before
|
||||
installing the applications below`) }}
|
||||
<div v-show="!helmInstalled" class="cluster-application-warning">
|
||||
<div class="svg-container" v-html="helmInstallIllustration"></div>
|
||||
{{
|
||||
s__(`ClusterIntegration|You must first install Helm Tiller before
|
||||
installing the applications below`)
|
||||
}}
|
||||
</div>
|
||||
<application-row
|
||||
:id="ingressId"
|
||||
|
@ -205,9 +233,11 @@ export default {
|
|||
>
|
||||
<div slot="description">
|
||||
<p>
|
||||
{{ s__(`ClusterIntegration|Ingress gives you a way to route
|
||||
{{
|
||||
s__(`ClusterIntegration|Ingress gives you a way to route
|
||||
requests to services based on the request host or path,
|
||||
centralizing a number of services into a single entrypoint.`) }}
|
||||
centralizing a number of services into a single entrypoint.`)
|
||||
}}
|
||||
</p>
|
||||
|
||||
<template v-if="ingressInstalled">
|
||||
|
@ -215,10 +245,7 @@ export default {
|
|||
<label for="ingress-ip-address">
|
||||
{{ s__('ClusterIntegration|Ingress IP Address') }}
|
||||
</label>
|
||||
<div
|
||||
v-if="ingressExternalIp"
|
||||
class="input-group"
|
||||
>
|
||||
<div v-if="ingressExternalIp" class="input-group">
|
||||
<input
|
||||
id="ingress-ip-address"
|
||||
:value="ingressExternalIp"
|
||||
|
@ -234,53 +261,80 @@ export default {
|
|||
/>
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
v-else
|
||||
type="text"
|
||||
class="form-control js-ip-address"
|
||||
readonly
|
||||
value="?"
|
||||
/>
|
||||
<input v-else type="text" class="form-control js-ip-address" readonly value="?" />
|
||||
<p class="form-text text-muted">
|
||||
{{
|
||||
s__(`ClusterIntegration|Point a wildcard DNS to this
|
||||
generated IP address in order to access
|
||||
your application after it has been deployed.`)
|
||||
}}
|
||||
<a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p
|
||||
v-if="!ingressExternalIp"
|
||||
class="settings-message js-no-ip-message"
|
||||
>
|
||||
{{ s__(`ClusterIntegration|The IP address is in
|
||||
<p v-if="!ingressExternalIp" class="settings-message js-no-ip-message">
|
||||
{{
|
||||
s__(`ClusterIntegration|The IP address is in
|
||||
the process of being assigned. Please check your Kubernetes
|
||||
cluster or Quotas on Google Kubernetes Engine if it takes a long time.`) }}
|
||||
cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
|
||||
}}
|
||||
|
||||
<a
|
||||
:href="ingressHelpPath"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<a :href="ingressHelpPath" target="_blank" rel="noopener noreferrer">
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
{{ s__(`ClusterIntegration|Point a wildcard DNS to this
|
||||
generated IP address in order to access
|
||||
your application after it has been deployed.`) }}
|
||||
<a
|
||||
:href="ingressDnsHelpPath"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
|
||||
</template>
|
||||
<div
|
||||
v-html="ingressDescription"
|
||||
>
|
||||
</div>
|
||||
<div v-html="ingressDescription"></div>
|
||||
</div>
|
||||
</application-row>
|
||||
<application-row
|
||||
id="cert_manager"
|
||||
:logo-url="certManagerLogo"
|
||||
:title="applications.cert_manager.title"
|
||||
:status="applications.cert_manager.status"
|
||||
:status-reason="applications.cert_manager.statusReason"
|
||||
:request-status="applications.cert_manager.requestStatus"
|
||||
:request-reason="applications.cert_manager.requestReason"
|
||||
:install-application-request-params="{ email: applications.cert_manager.email }"
|
||||
:disabled="!helmInstalled"
|
||||
title-link="https://cert-manager.readthedocs.io/en/latest/#"
|
||||
>
|
||||
<template>
|
||||
<div slot="description">
|
||||
<p v-html="certManagerDescription"></p>
|
||||
<div class="form-group">
|
||||
<label for="cert-manager-issuer-email">
|
||||
{{ s__('ClusterIntegration|Issuer Email') }}
|
||||
</label>
|
||||
<div class="input-group">
|
||||
<input
|
||||
v-model="applications.cert_manager.email"
|
||||
:readonly="certManagerInstalled"
|
||||
type="text"
|
||||
class="form-control js-email"
|
||||
/>
|
||||
</div>
|
||||
<p class="form-text text-muted">
|
||||
{{
|
||||
s__(`ClusterIntegration|Issuers represent a certificate authority.
|
||||
You must provide an email address for your Issuer. `)
|
||||
}}
|
||||
<a
|
||||
href="http://docs.cert-manager.io/en/latest/reference/issuers.html?highlight=email"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</application-row>
|
||||
<application-row
|
||||
v-if="isProjectCluster"
|
||||
id="prometheus"
|
||||
:logo-url="prometheusLogo"
|
||||
:title="applications.prometheus.title"
|
||||
|
@ -292,13 +346,10 @@ export default {
|
|||
:disabled="!helmInstalled"
|
||||
title-link="https://prometheus.io/docs/introduction/overview/"
|
||||
>
|
||||
<div
|
||||
slot="description"
|
||||
v-html="prometheusDescription"
|
||||
>
|
||||
</div>
|
||||
<div slot="description" v-html="prometheusDescription"></div>
|
||||
</application-row>
|
||||
<application-row
|
||||
v-if="isProjectCluster"
|
||||
id="runner"
|
||||
:logo-url="gitlabLogo"
|
||||
:title="applications.runner.title"
|
||||
|
@ -310,13 +361,16 @@ export default {
|
|||
title-link="https://docs.gitlab.com/runner/"
|
||||
>
|
||||
<div slot="description">
|
||||
{{ s__(`ClusterIntegration|GitLab Runner connects to this
|
||||
{{
|
||||
s__(`ClusterIntegration|GitLab Runner connects to this
|
||||
project's repository and executes CI/CD jobs,
|
||||
pushing results back and deploying,
|
||||
applications to production.`) }}
|
||||
applications to production.`)
|
||||
}}
|
||||
</div>
|
||||
</application-row>
|
||||
<application-row
|
||||
v-if="isProjectCluster"
|
||||
id="jupyter"
|
||||
:logo-url="jupyterhubLogo"
|
||||
:title="applications.jupyter.title"
|
||||
|
@ -330,11 +384,13 @@ export default {
|
|||
>
|
||||
<div slot="description">
|
||||
<p>
|
||||
{{ s__(`ClusterIntegration|JupyterHub, a multi-user Hub, spawns,
|
||||
{{
|
||||
s__(`ClusterIntegration|JupyterHub, a multi-user Hub, spawns,
|
||||
manages, and proxies multiple instances of the single-user
|
||||
Jupyter notebook server. JupyterHub can be used to serve
|
||||
notebooks to a class of students, a corporate data science group,
|
||||
or a scientific research group.`) }}
|
||||
or a scientific research group.`)
|
||||
}}
|
||||
</p>
|
||||
|
||||
<template v-if="ingressExternalIp">
|
||||
|
@ -350,9 +406,7 @@ export default {
|
|||
type="text"
|
||||
class="form-control js-hostname"
|
||||
/>
|
||||
<span
|
||||
class="input-group-btn"
|
||||
>
|
||||
<span class="input-group-btn">
|
||||
<clipboard-button
|
||||
:text="jupyterHostname"
|
||||
:title="s__('ClusterIntegration|Copy Jupyter Hostname to clipboard')"
|
||||
|
@ -360,22 +414,22 @@ export default {
|
|||
/>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<p v-if="ingressInstalled" class="form-text text-muted">
|
||||
{{
|
||||
s__(`ClusterIntegration|Replace this with your own hostname if you want.
|
||||
If you do so, point hostname to Ingress IP Address from above.`)
|
||||
}}
|
||||
<a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<p v-if="ingressInstalled">
|
||||
{{ s__(`ClusterIntegration|Replace this with your own hostname if you want.
|
||||
If you do so, point hostname to Ingress IP Address from above.`) }}
|
||||
<a
|
||||
:href="ingressDnsHelpPath"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
</template>
|
||||
</div>
|
||||
</application-row>
|
||||
<application-row
|
||||
v-if="isProjectCluster"
|
||||
id="knative"
|
||||
:logo-url="knativeLogo"
|
||||
:title="applications.knative.title"
|
||||
|
@ -383,19 +437,18 @@ export default {
|
|||
:status-reason="applications.knative.statusReason"
|
||||
:request-status="applications.knative.requestStatus"
|
||||
:request-reason="applications.knative.requestReason"
|
||||
:install-application-request-params="{ hostname: applications.knative.hostname}"
|
||||
:install-application-request-params="{ hostname: applications.knative.hostname }"
|
||||
:disabled="!helmInstalled"
|
||||
class="hide-bottom-border rounded-bottom"
|
||||
title-link="https://github.com/knative/docs"
|
||||
>
|
||||
<div slot="description">
|
||||
<p>
|
||||
{{ s__(`ClusterIntegration|A Knative build extends Kubernetes
|
||||
and utilizes existing Kubernetes primitives to provide you with
|
||||
the ability to run on-cluster container builds from source.
|
||||
For example, you can write a build that uses Kubernetes-native
|
||||
resources to obtain your source code from a repository,
|
||||
build it into container a image, and then run that image.`) }}
|
||||
{{
|
||||
s__(`ClusterIntegration|Knative extends Kubernetes to provide
|
||||
a set of middleware components that are essential to build modern,
|
||||
source-centric, and container-based applications that can run
|
||||
anywhere: on premises, in the cloud, or even in a third-party data center.`)
|
||||
}}
|
||||
</p>
|
||||
|
||||
<template v-if="knativeInstalled">
|
||||
|
@ -412,7 +465,7 @@ export default {
|
|||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<template v-else-if="helmInstalled">
|
||||
<div class="form-group">
|
||||
<label for="knative-domainname">
|
||||
{{ s__('ClusterIntegration|Knative Domain Name:') }}
|
||||
|
@ -425,6 +478,49 @@ export default {
|
|||
/>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="knativeInstalled">
|
||||
<div class="form-group">
|
||||
<label for="knative-ip-address">
|
||||
{{ s__('ClusterIntegration|Knative IP Address:') }}
|
||||
</label>
|
||||
<div v-if="knativeExternalIp" class="input-group">
|
||||
<input
|
||||
id="knative-ip-address"
|
||||
:value="knativeExternalIp"
|
||||
type="text"
|
||||
class="form-control js-ip-address"
|
||||
readonly
|
||||
/>
|
||||
<span class="input-group-append">
|
||||
<clipboard-button
|
||||
:text="knativeExternalIp"
|
||||
:title="s__('ClusterIntegration|Copy Knative IP Address to clipboard')"
|
||||
class="input-group-text js-clipboard-btn"
|
||||
/>
|
||||
</span>
|
||||
</div>
|
||||
<input v-else type="text" class="form-control js-ip-address" readonly value="?" />
|
||||
</div>
|
||||
|
||||
<p v-if="!knativeExternalIp" class="settings-message js-no-ip-message">
|
||||
{{
|
||||
s__(`ClusterIntegration|The IP address is in
|
||||
the process of being assigned. Please check your Kubernetes
|
||||
cluster or Quotas on Google Kubernetes Engine if it takes a long time.`)
|
||||
}}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
{{
|
||||
s__(`ClusterIntegration|Point a wildcard DNS to this
|
||||
generated IP address in order to access
|
||||
your application after it has been deployed.`)
|
||||
}}
|
||||
<a :href="ingressDnsHelpPath" target="_blank" rel="noopener noreferrer">
|
||||
{{ __('More information') }}
|
||||
</a>
|
||||
</p>
|
||||
</template>
|
||||
</div>
|
||||
</application-row>
|
||||
</div>
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
// These need to match the enum found in app/models/clusters/cluster.rb
|
||||
export const CLUSTER_TYPE = {
|
||||
INSTANCE: 'instance_type',
|
||||
GROUP: 'group_type',
|
||||
PROJECT: 'project_type',
|
||||
};
|
||||
|
||||
// These need to match what is returned from the server
|
||||
export const APPLICATION_STATUS = {
|
||||
NOT_INSTALLABLE: 'not_installable',
|
||||
|
@ -17,3 +24,4 @@ export const REQUEST_FAILURE = 'request-failure';
|
|||
export const INGRESS = 'ingress';
|
||||
export const JUPYTER = 'jupyter';
|
||||
export const KNATIVE = 'knative';
|
||||
export const CERT_MANAGER = 'cert_manager';
|
||||
|
|
|
@ -6,6 +6,7 @@ export default class ClusterService {
|
|||
this.appInstallEndpointMap = {
|
||||
helm: this.options.installHelmEndpoint,
|
||||
ingress: this.options.installIngressEndpoint,
|
||||
cert_manager: this.options.installCertManagerEndpoint,
|
||||
runner: this.options.installRunnerEndpoint,
|
||||
prometheus: this.options.installPrometheusEndpoint,
|
||||
jupyter: this.options.installJupyterEndpoint,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { s__ } from '../../locale';
|
||||
import { INGRESS, JUPYTER, KNATIVE } from '../constants';
|
||||
import { INGRESS, JUPYTER, KNATIVE, CERT_MANAGER } from '../constants';
|
||||
|
||||
export default class ClusterStore {
|
||||
constructor() {
|
||||
|
@ -24,6 +24,14 @@ export default class ClusterStore {
|
|||
requestReason: null,
|
||||
externalIp: null,
|
||||
},
|
||||
cert_manager: {
|
||||
title: s__('ClusterIntegration|Cert-Manager'),
|
||||
status: null,
|
||||
statusReason: null,
|
||||
requestStatus: null,
|
||||
requestReason: null,
|
||||
email: null,
|
||||
},
|
||||
runner: {
|
||||
title: s__('ClusterIntegration|GitLab Runner'),
|
||||
status: null,
|
||||
|
@ -53,6 +61,7 @@ export default class ClusterStore {
|
|||
requestStatus: null,
|
||||
requestReason: null,
|
||||
hostname: null,
|
||||
externalIp: null,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -95,6 +104,9 @@ export default class ClusterStore {
|
|||
|
||||
if (appId === INGRESS) {
|
||||
this.state.applications.ingress.externalIp = serverAppEntry.external_ip;
|
||||
} else if (appId === CERT_MANAGER) {
|
||||
this.state.applications.cert_manager.email =
|
||||
this.state.applications.cert_manager.email || serverAppEntry.email;
|
||||
} else if (appId === JUPYTER) {
|
||||
this.state.applications.jupyter.hostname =
|
||||
serverAppEntry.hostname ||
|
||||
|
@ -104,6 +116,8 @@ export default class ClusterStore {
|
|||
} else if (appId === KNATIVE) {
|
||||
this.state.applications.knative.hostname =
|
||||
serverAppEntry.hostname || this.state.applications.knative.hostname;
|
||||
this.state.applications.knative.externalIp =
|
||||
serverAppEntry.external_ip || this.state.applications.knative.externalIp;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -82,7 +82,6 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<div class="content-list pipelines">
|
||||
|
||||
<gl-loading-icon
|
||||
v-if="isLoading"
|
||||
:label="s__('Pipelines|Loading Pipelines')"
|
||||
|
@ -93,14 +92,13 @@ export default {
|
|||
<svg-blank-state
|
||||
v-else-if="shouldRenderErrorState"
|
||||
:svg-path="errorStateSvgPath"
|
||||
:message="s__(`Pipelines|There was an error fetching the pipelines.
|
||||
Try again in a few moments or contact your support team.`)"
|
||||
:message="
|
||||
s__(`Pipelines|There was an error fetching the pipelines.
|
||||
Try again in a few moments or contact your support team.`)
|
||||
"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-else-if="shouldRenderTable"
|
||||
class="table-holder"
|
||||
>
|
||||
<div v-else-if="shouldRenderTable" class="table-holder">
|
||||
<pipelines-table-component
|
||||
:pipelines="state.pipelines"
|
||||
:update-graph-dropdown="updateGraphDropdown"
|
||||
|
|
|
@ -2,6 +2,7 @@ import $ from 'jquery';
|
|||
import Cookies from 'js-cookie';
|
||||
import _ from 'underscore';
|
||||
import bp from './breakpoints';
|
||||
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||
|
||||
export default class ContextualSidebar {
|
||||
constructor() {
|
||||
|
@ -78,7 +79,7 @@ export default class ContextualSidebar {
|
|||
if (breakpoint === 'sm' || breakpoint === 'md') {
|
||||
this.toggleCollapsedSidebar(true);
|
||||
} else if (breakpoint === 'lg') {
|
||||
const collapse = Cookies.get('sidebar_collapsed') === 'true';
|
||||
const collapse = parseBoolean(Cookies.get('sidebar_collapsed'));
|
||||
this.toggleCollapsedSidebar(collapse);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,30 +32,19 @@ export default {
|
|||
type="button"
|
||||
@click="dismissOverviewDialog"
|
||||
>
|
||||
<icon
|
||||
name="close"
|
||||
/>
|
||||
<icon name="close" />
|
||||
</button>
|
||||
<div
|
||||
class="svg-container"
|
||||
v-html="iconCycleAnalyticsSplash"
|
||||
>
|
||||
</div>
|
||||
<div class="svg-container" v-html="iconCycleAnalyticsSplash"></div>
|
||||
<div class="inner-content">
|
||||
<h4>
|
||||
{{ __('Introducing Cycle Analytics') }}
|
||||
</h4>
|
||||
<h4>{{ __('Introducing Cycle Analytics') }}</h4>
|
||||
<p>
|
||||
{{ __(`Cycle Analytics gives an overview
|
||||
of how much time it takes to go from idea to production in your project.`) }}
|
||||
{{
|
||||
__(`Cycle Analytics gives an overview
|
||||
of how much time it takes to go from idea to production in your project.`)
|
||||
}}
|
||||
</p>
|
||||
<p>
|
||||
<a
|
||||
:href="documentationLink"
|
||||
target="_blank"
|
||||
rel="nofollow"
|
||||
class="btn"
|
||||
>
|
||||
<a :href="documentationLink" target="_blank" rel="nofollow" class="btn">
|
||||
{{ __('Read more') }}
|
||||
</a>
|
||||
</p>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
<script>
|
||||
import tooltip from '../../vue_shared/directives/tooltip';
|
||||
import { GlTooltipDirective } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
tooltip,
|
||||
GlTooltip: GlTooltipDirective,
|
||||
},
|
||||
props: {
|
||||
count: {
|
||||
|
@ -14,20 +14,14 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<span
|
||||
v-if="count === 50"
|
||||
class="events-info float-right"
|
||||
>
|
||||
<span v-if="count === 50" class="events-info float-right">
|
||||
<i
|
||||
v-tooltip
|
||||
:title="n__(
|
||||
'Limited to showing %d event at most',
|
||||
'Limited to showing %d events at most',
|
||||
50
|
||||
)"
|
||||
v-gl-tooltip
|
||||
:title="
|
||||
n__('Limited to showing %d event at most', 'Limited to showing %d events at most', 50)
|
||||
"
|
||||
class="fa fa-warning"
|
||||
aria-hidden="true"
|
||||
data-placement="top"
|
||||
>
|
||||
</i>
|
||||
{{ n__('Showing %d event', 'Showing %d events', 50) }}
|
||||
|
|
|
@ -28,45 +28,26 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(mergeRequest, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item"
|
||||
>
|
||||
<li v-for="(mergeRequest, i) in items" :key="i" class="stage-event-item">
|
||||
<div class="item-details">
|
||||
<!-- FIXME: Pass an alt attribute here for accessibility -->
|
||||
<user-avatar-image :img-src="mergeRequest.author.avatarUrl" />
|
||||
<h5 class="item-title merge-merquest-title">
|
||||
<a :href="mergeRequest.url">
|
||||
{{ mergeRequest.title }}
|
||||
</a>
|
||||
<a :href="mergeRequest.url"> {{ mergeRequest.title }} </a>
|
||||
</h5>
|
||||
<a
|
||||
:href="mergeRequest.url"
|
||||
class="issue-link">
|
||||
!{{ mergeRequest.iid }}
|
||||
</a>
|
||||
·
|
||||
<a :href="mergeRequest.url" class="issue-link"> !{{ mergeRequest.iid }} </a> ·
|
||||
<span>
|
||||
{{ s__('OpenedNDaysAgo|Opened') }}
|
||||
<a
|
||||
:href="mergeRequest.url"
|
||||
class="issue-date">
|
||||
{{ mergeRequest.createdAt }}
|
||||
</a>
|
||||
<a :href="mergeRequest.url" class="issue-date"> {{ mergeRequest.createdAt }} </a>
|
||||
</span>
|
||||
<span>
|
||||
{{ s__('ByAuthor|by') }}
|
||||
<a
|
||||
:href="mergeRequest.author.webUrl"
|
||||
class="issue-author-link">
|
||||
<a :href="mergeRequest.author.webUrl" class="issue-author-link">
|
||||
{{ mergeRequest.author.name }}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="mergeRequest.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="mergeRequest.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -28,47 +28,24 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(issue, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item"
|
||||
>
|
||||
<li v-for="(issue, i) in items" :key="i" class="stage-event-item">
|
||||
<div class="item-details">
|
||||
<!-- FIXME: Pass an alt attribute here for accessibility -->
|
||||
<user-avatar-image :img-src="issue.author.avatarUrl"/>
|
||||
<user-avatar-image :img-src="issue.author.avatarUrl" />
|
||||
<h5 class="item-title issue-title">
|
||||
<a
|
||||
:href="issue.url"
|
||||
class="issue-title"
|
||||
>
|
||||
{{ issue.title }}
|
||||
</a>
|
||||
<a :href="issue.url" class="issue-title"> {{ issue.title }} </a>
|
||||
</h5>
|
||||
<a
|
||||
:href="issue.url"
|
||||
class="issue-link"
|
||||
>#{{ issue.iid }}</a>
|
||||
·
|
||||
<a :href="issue.url" class="issue-link">#{{ issue.iid }}</a> ·
|
||||
<span>
|
||||
{{ s__('OpenedNDaysAgo|Opened') }}
|
||||
<a
|
||||
:href="issue.url"
|
||||
class="issue-date"
|
||||
>{{ issue.createdAt }}</a>
|
||||
<a :href="issue.url" class="issue-date">{{ issue.createdAt }}</a>
|
||||
</span>
|
||||
<span>
|
||||
{{ s__('ByAuthor|by') }}
|
||||
<a
|
||||
:href="issue.author.webUrl"
|
||||
class="issue-author-link"
|
||||
>
|
||||
{{ issue.author.name }}
|
||||
</a>
|
||||
<a :href="issue.author.webUrl" class="issue-author-link"> {{ issue.author.name }} </a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="issue.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="issue.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -34,42 +34,25 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(commit, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item"
|
||||
>
|
||||
<li v-for="(commit, i) in items" :key="i" class="stage-event-item">
|
||||
<div class="item-details item-conmmit-component">
|
||||
<!-- FIXME: Pass an alt attribute here for accessibility -->
|
||||
<user-avatar-image :img-src="commit.author.avatarUrl" />
|
||||
<h5 class="item-title commit-title">
|
||||
<a :href="commit.commitUrl">
|
||||
{{ commit.title }}
|
||||
</a>
|
||||
<a :href="commit.commitUrl"> {{ commit.title }} </a>
|
||||
</h5>
|
||||
<span>
|
||||
{{ s__('FirstPushedBy|First') }}
|
||||
<span
|
||||
class="commit-icon"
|
||||
v-html="iconCommit"
|
||||
>
|
||||
</span>
|
||||
<a
|
||||
:href="commit.commitUrl"
|
||||
class="commit-hash-link commit-sha"
|
||||
>{{ commit.shortSha }}</a>
|
||||
{{ s__('FirstPushedBy|First') }} <span class="commit-icon" v-html="iconCommit"> </span>
|
||||
<a :href="commit.commitUrl" class="commit-hash-link commit-sha">{{
|
||||
commit.shortSha
|
||||
}}</a>
|
||||
{{ s__('FirstPushedBy|pushed by') }}
|
||||
<a
|
||||
:href="commit.author.webUrl"
|
||||
class="commit-author-link"
|
||||
>
|
||||
<a :href="commit.author.webUrl" class="commit-author-link">
|
||||
{{ commit.author.name }}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="commit.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="commit.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -30,66 +30,37 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(mergeRequest, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item"
|
||||
>
|
||||
<li v-for="(mergeRequest, i) in items" :key="i" class="stage-event-item">
|
||||
<div class="item-details">
|
||||
<!-- FIXME: Pass an alt attribute here for accessibility -->
|
||||
<user-avatar-image :img-src="mergeRequest.author.avatarUrl" />
|
||||
<h5 class="item-title merge-merquest-title">
|
||||
<a :href="mergeRequest.url">
|
||||
{{ mergeRequest.title }}
|
||||
</a>
|
||||
<a :href="mergeRequest.url"> {{ mergeRequest.title }} </a>
|
||||
</h5>
|
||||
<a
|
||||
:href="mergeRequest.url"
|
||||
class="issue-link"
|
||||
>!{{ mergeRequest.iid }}</a>
|
||||
·
|
||||
<a :href="mergeRequest.url" class="issue-link">!{{ mergeRequest.iid }}</a> ·
|
||||
<span>
|
||||
{{ s__('OpenedNDaysAgo|Opened') }}
|
||||
<a
|
||||
:href="mergeRequest.url"
|
||||
class="issue-date"
|
||||
>{{ mergeRequest.createdAt }}</a>
|
||||
<a :href="mergeRequest.url" class="issue-date">{{ mergeRequest.createdAt }}</a>
|
||||
</span>
|
||||
<span>
|
||||
{{ s__('ByAuthor|by') }}
|
||||
<a
|
||||
:href="mergeRequest.author.webUrl"
|
||||
class="issue-author-link"
|
||||
>{{ mergeRequest.author.name }}</a>
|
||||
<a :href="mergeRequest.author.webUrl" class="issue-author-link">{{
|
||||
mergeRequest.author.name
|
||||
}}</a>
|
||||
</span>
|
||||
<template v-if="mergeRequest.state === 'closed'">
|
||||
<span class="merge-request-state">
|
||||
<i
|
||||
class="fa fa-ban"
|
||||
aria-hidden="true"
|
||||
>
|
||||
</i>
|
||||
{{ mergeRequest.state.toUpperCase() }}
|
||||
<i class="fa fa-ban" aria-hidden="true"> </i> {{ mergeRequest.state.toUpperCase() }}
|
||||
</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<span
|
||||
v-if="mergeRequest.branch"
|
||||
class="merge-request-branch"
|
||||
>
|
||||
<icon
|
||||
:size="16"
|
||||
name="fork"
|
||||
/>
|
||||
<a :href="mergeRequest.branch.url">
|
||||
{{ mergeRequest.branch.name }}
|
||||
</a>
|
||||
<span v-if="mergeRequest.branch" class="merge-request-branch">
|
||||
<icon :size="16" name="fork" />
|
||||
<a :href="mergeRequest.branch.url"> {{ mergeRequest.branch.name }} </a>
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="mergeRequest.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="mergeRequest.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -36,62 +36,23 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(build, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item item-build-component"
|
||||
>
|
||||
<li v-for="(build, i) in items" :key="i" class="stage-event-item item-build-component">
|
||||
<div class="item-details">
|
||||
<!-- FIXME: Pass an alt attribute here for accessibility -->
|
||||
<user-avatar-image :img-src="build.author.avatarUrl"/>
|
||||
<user-avatar-image :img-src="build.author.avatarUrl" />
|
||||
<h5 class="item-title">
|
||||
<a
|
||||
:href="build.url"
|
||||
class="pipeline-id"
|
||||
>
|
||||
#{{ build.id }}
|
||||
</a>
|
||||
<icon
|
||||
:size="16"
|
||||
name="fork"
|
||||
/>
|
||||
<a
|
||||
:href="build.branch.url"
|
||||
class="ref-name"
|
||||
>
|
||||
{{ build.branch.name }}
|
||||
</a>
|
||||
<span
|
||||
class="icon-branch"
|
||||
v-html="iconBranch"
|
||||
>
|
||||
</span>
|
||||
<a
|
||||
:href="build.commitUrl"
|
||||
class="commit-sha"
|
||||
>
|
||||
{{ build.shortSha }}
|
||||
</a>
|
||||
<a :href="build.url" class="pipeline-id"> #{{ build.id }} </a>
|
||||
<icon :size="16" name="fork" />
|
||||
<a :href="build.branch.url" class="ref-name"> {{ build.branch.name }} </a>
|
||||
<span class="icon-branch" v-html="iconBranch"> </span>
|
||||
<a :href="build.commitUrl" class="commit-sha"> {{ build.shortSha }} </a>
|
||||
</h5>
|
||||
<span>
|
||||
<a
|
||||
:href="build.url"
|
||||
class="build-date"
|
||||
>
|
||||
{{ build.date }}
|
||||
</a>
|
||||
{{ s__('ByAuthor|by') }}
|
||||
<a
|
||||
:href="build.author.webUrl"
|
||||
class="issue-author-link"
|
||||
>
|
||||
{{ build.author.name }}
|
||||
</a>
|
||||
<a :href="build.url" class="build-date"> {{ build.date }} </a> {{ s__('ByAuthor|by') }}
|
||||
<a :href="build.author.webUrl" class="issue-author-link"> {{ build.author.name }} </a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="build.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="build.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -38,63 +38,22 @@ export default {
|
|||
<limit-warning :count="items.length" />
|
||||
</div>
|
||||
<ul class="stage-event-list">
|
||||
<li
|
||||
v-for="(build, i) in items"
|
||||
:key="i"
|
||||
class="stage-event-item item-build-component"
|
||||
>
|
||||
<li v-for="(build, i) in items" :key="i" class="stage-event-item item-build-component">
|
||||
<div class="item-details">
|
||||
<h5 class="item-title">
|
||||
<span
|
||||
class="icon-build-status"
|
||||
v-html="iconBuildStatus"
|
||||
>
|
||||
</span>
|
||||
<a
|
||||
:href="build.url"
|
||||
class="item-build-name"
|
||||
>
|
||||
{{ build.name }}
|
||||
</a>
|
||||
·
|
||||
<a
|
||||
:href="build.url"
|
||||
class="pipeline-id"
|
||||
>
|
||||
#{{ build.id }}
|
||||
</a>
|
||||
<icon
|
||||
:size="16"
|
||||
name="fork"
|
||||
/>
|
||||
<a
|
||||
:href="build.branch.url"
|
||||
class="ref-name"
|
||||
>
|
||||
{{ build.branch.name }}
|
||||
</a>
|
||||
<span
|
||||
class="icon-branch"
|
||||
v-html="iconBranch"
|
||||
>
|
||||
</span>
|
||||
<a
|
||||
:href="build.commitUrl"
|
||||
class="commit-sha">
|
||||
{{ build.shortSha }}
|
||||
</a>
|
||||
<span class="icon-build-status" v-html="iconBuildStatus"> </span>
|
||||
<a :href="build.url" class="item-build-name"> {{ build.name }} </a> ·
|
||||
<a :href="build.url" class="pipeline-id"> #{{ build.id }} </a>
|
||||
<icon :size="16" name="fork" />
|
||||
<a :href="build.branch.url" class="ref-name"> {{ build.branch.name }} </a>
|
||||
<span class="icon-branch" v-html="iconBranch"> </span>
|
||||
<a :href="build.commitUrl" class="commit-sha"> {{ build.shortSha }} </a>
|
||||
</h5>
|
||||
<span>
|
||||
<a
|
||||
:href="build.url"
|
||||
class="issue-date">
|
||||
{{ build.date }}
|
||||
</a>
|
||||
<a :href="build.url" class="issue-date"> {{ build.date }} </a>
|
||||
</span>
|
||||
</div>
|
||||
<div class="item-time">
|
||||
<total-time :time="build.totalTime" />
|
||||
</div>
|
||||
<div class="item-time"><total-time :time="build.totalTime" /></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -18,28 +18,16 @@ export default {
|
|||
<span class="total-time">
|
||||
<template v-if="hasData">
|
||||
<template v-if="time.days">
|
||||
{{ time.days }}
|
||||
<span>
|
||||
{{ n__('day', 'days', time.days) }}
|
||||
</span>
|
||||
{{ time.days }} <span> {{ n__('day', 'days', time.days) }} </span>
|
||||
</template>
|
||||
<template v-if="time.hours">
|
||||
{{ time.hours }}
|
||||
<span>
|
||||
{{ n__('Time|hr', 'Time|hrs', time.hours) }}
|
||||
</span>
|
||||
{{ time.hours }} <span> {{ n__('Time|hr', 'Time|hrs', time.hours) }} </span>
|
||||
</template>
|
||||
<template v-if="time.mins && !time.days">
|
||||
{{ time.mins }}
|
||||
<span>
|
||||
{{ n__('Time|min', 'Time|mins', time.mins) }}
|
||||
</span>
|
||||
{{ time.mins }} <span> {{ n__('Time|min', 'Time|mins', time.mins) }} </span>
|
||||
</template>
|
||||
<template v-if="time.seconds && hasData === 1 || time.seconds === 0">
|
||||
{{ time.seconds }}
|
||||
<span>
|
||||
{{ s__('Time|s') }}
|
||||
</span>
|
||||
<template v-if="(time.seconds && hasData === 1) || time.seconds === 0">
|
||||
{{ time.seconds }} <span> {{ s__('Time|s') }} </span>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import eventHub from '../eventhub';
|
||||
|
||||
export default {
|
||||
|
@ -43,11 +43,9 @@ export default {
|
|||
:class="[{ disabled: isLoading }, btnCssClass]"
|
||||
:disabled="isLoading"
|
||||
class="btn"
|
||||
@click="doAction">
|
||||
@click="doAction"
|
||||
>
|
||||
<slot></slot>
|
||||
<gl-loading-icon
|
||||
v-if="isLoading"
|
||||
:inline="true"
|
||||
/>
|
||||
<gl-loading-icon v-if="isLoading" :inline="true" />
|
||||
</button>
|
||||
</template>
|
||||
|
|
|
@ -6,7 +6,7 @@ import eventHub from '../eventhub';
|
|||
import DeployKeysService from '../service';
|
||||
import DeployKeysStore from '../store';
|
||||
import KeysPanel from './keys_panel.vue';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
|
@ -123,26 +123,10 @@ export default {
|
|||
/>
|
||||
<template v-else-if="hasKeys">
|
||||
<div class="top-area scrolling-tabs-container inner-page-scroll-tabs">
|
||||
<div class="fade-left">
|
||||
<i
|
||||
class="fa fa-angle-left"
|
||||
aria-hidden="true"
|
||||
>
|
||||
</i>
|
||||
</div>
|
||||
<div class="fade-right">
|
||||
<i
|
||||
class="fa fa-angle-right"
|
||||
aria-hidden="true"
|
||||
>
|
||||
</i>
|
||||
</div>
|
||||
<div class="fade-left"><i class="fa fa-angle-left" aria-hidden="true"> </i></div>
|
||||
<div class="fade-right"><i class="fa fa-angle-right" aria-hidden="true"> </i></div>
|
||||
|
||||
<navigation-tabs
|
||||
:tabs="tabs"
|
||||
scope="deployKeys"
|
||||
@onChangeTab="onChangeTab"
|
||||
/>
|
||||
<navigation-tabs :tabs="tabs" scope="deployKeys" @onChangeTab="onChangeTab" />
|
||||
</div>
|
||||
<keys-panel
|
||||
:project-id="projectId"
|
||||
|
|
|
@ -112,26 +112,14 @@ export default {
|
|||
<template>
|
||||
<div class="gl-responsive-table-row deploy-key">
|
||||
<div class="table-section section-40">
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-mobile-header">
|
||||
{{ s__('DeployKeys|Deploy key') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-mobile-header">{{ s__('DeployKeys|Deploy key') }}</div>
|
||||
<div class="table-mobile-content">
|
||||
<strong class="title qa-key-title">
|
||||
{{ deployKey.title }}
|
||||
</strong>
|
||||
<div class="fingerprint qa-key-fingerprint">
|
||||
{{ deployKey.fingerprint }}
|
||||
</div>
|
||||
<strong class="title qa-key-title"> {{ deployKey.title }} </strong>
|
||||
<div class="fingerprint qa-key-fingerprint">{{ deployKey.fingerprint }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-section section-30 section-wrap">
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-mobile-header">
|
||||
{{ s__('DeployKeys|Project usage') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-mobile-header">{{ s__('DeployKeys|Project usage') }}</div>
|
||||
<div class="table-mobile-content deploy-project-list">
|
||||
<template v-if="projects.length > 0">
|
||||
<a
|
||||
|
@ -139,10 +127,8 @@ export default {
|
|||
:title="projectTooltipTitle(firstProject)"
|
||||
class="label deploy-project-label"
|
||||
>
|
||||
<span>
|
||||
{{ firstProject.project.full_name }}
|
||||
</span>
|
||||
<icon :name="firstProject.can_push ? 'lock-open' : 'lock'"/>
|
||||
<span> {{ firstProject.project.full_name }} </span>
|
||||
<icon :name="firstProject.can_push ? 'lock-open' : 'lock'" />
|
||||
</a>
|
||||
<a
|
||||
v-if="isExpandable"
|
||||
|
@ -162,39 +148,24 @@ export default {
|
|||
:title="projectTooltipTitle(deployKeysProject)"
|
||||
class="label deploy-project-label"
|
||||
>
|
||||
<span>
|
||||
{{ deployKeysProject.project.full_name }}
|
||||
</span>
|
||||
<icon :name="deployKeysProject.can_push ? 'lock-open' : 'lock'"/>
|
||||
<span> {{ deployKeysProject.project.full_name }} </span>
|
||||
<icon :name="deployKeysProject.can_push ? 'lock-open' : 'lock'" />
|
||||
</a>
|
||||
</template>
|
||||
<span
|
||||
v-else
|
||||
class="text-secondary">{{ __('None') }}</span>
|
||||
<span v-else class="text-secondary">{{ __('None') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-section section-15 text-right">
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-mobile-header">
|
||||
{{ __('Created') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-mobile-header">{{ __('Created') }}</div>
|
||||
<div class="table-mobile-content text-secondary key-created-at">
|
||||
<span
|
||||
v-tooltip
|
||||
:title="tooltipTitle(deployKey.created_at)">
|
||||
<icon name="calendar"/>
|
||||
<span>{{ timeFormated(deployKey.created_at) }}</span>
|
||||
<span v-tooltip :title="tooltipTitle(deployKey.created_at)">
|
||||
<icon name="calendar" /> <span>{{ timeFormated(deployKey.created_at) }}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-section section-15 table-button-footer deploy-key-actions">
|
||||
<div class="btn-group table-action-buttons">
|
||||
<action-btn
|
||||
v-if="!isEnabled"
|
||||
:deploy-key="deployKey"
|
||||
type="enable"
|
||||
>
|
||||
<action-btn v-if="!isEnabled" :deploy-key="deployKey" type="enable">
|
||||
{{ __('Enable') }}
|
||||
</action-btn>
|
||||
<a
|
||||
|
@ -205,7 +176,7 @@ export default {
|
|||
class="btn btn-default text-secondary"
|
||||
data-container="body"
|
||||
>
|
||||
<icon name="pencil"/>
|
||||
<icon name="pencil" />
|
||||
</a>
|
||||
<action-btn
|
||||
v-if="isRemovable"
|
||||
|
@ -216,7 +187,7 @@ export default {
|
|||
type="remove"
|
||||
data-container="body"
|
||||
>
|
||||
<icon name="remove"/>
|
||||
<icon name="remove" />
|
||||
</action-btn>
|
||||
<action-btn
|
||||
v-else-if="isEnabled"
|
||||
|
@ -227,7 +198,7 @@ export default {
|
|||
type="disable"
|
||||
data-container="body"
|
||||
>
|
||||
<icon name="cancel"/>
|
||||
<icon name="cancel" />
|
||||
</action-btn>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -30,24 +30,14 @@ export default {
|
|||
<template>
|
||||
<div class="deploy-keys-panel table-holder">
|
||||
<template v-if="keys.length > 0">
|
||||
<div
|
||||
role="row"
|
||||
class="gl-responsive-table-row table-row-header">
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-section section-40">
|
||||
<div role="row" class="gl-responsive-table-row table-row-header">
|
||||
<div role="rowheader" class="table-section section-40">
|
||||
{{ s__('DeployKeys|Deploy key') }}
|
||||
</div>
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-section section-30">
|
||||
<div role="rowheader" class="table-section section-30">
|
||||
{{ s__('DeployKeys|Project usage') }}
|
||||
</div>
|
||||
<div
|
||||
role="rowheader"
|
||||
class="table-section section-15 text-right">
|
||||
{{ __('Created') }}
|
||||
</div>
|
||||
<div role="rowheader" class="table-section section-15 text-right">{{ __('Created') }}</div>
|
||||
</div>
|
||||
<deploy-key
|
||||
v-for="deployKey in keys"
|
||||
|
@ -58,10 +48,7 @@ export default {
|
|||
:project-id="projectId"
|
||||
/>
|
||||
</template>
|
||||
<div
|
||||
v-else
|
||||
class="settings-message text-center"
|
||||
>
|
||||
<div v-else class="settings-message text-center">
|
||||
{{ s__('DeployKeys|No deploy keys found. Create one with the form above.') }}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -112,7 +112,7 @@ const JumpToDiscussion = Vue.extend({
|
|||
|
||||
if (!hasDiscussionsToJumpTo) {
|
||||
// If there are no discussions to jump to on the current page,
|
||||
// switch to the notes tab and jump to the first disucssion there.
|
||||
// switch to the notes tab and jump to the first discussion there.
|
||||
window.mrTabs.activateTab('show');
|
||||
activeTab = 'show';
|
||||
jumpToFirstDiscussion = true;
|
||||
|
|
|
@ -3,7 +3,7 @@ import { mapState, mapGetters, mapActions } from 'vuex';
|
|||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { __ } from '~/locale';
|
||||
import createFlash from '~/flash';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import eventHub from '../../notes/event_hub';
|
||||
import CompareVersions from './compare_versions.vue';
|
||||
import DiffFile from './diff_file.vue';
|
||||
|
@ -42,6 +42,16 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
helpPagePath: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
changesEmptyStateIllustration: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -55,8 +65,6 @@ export default {
|
|||
diffViewType: state => state.diffs.diffViewType,
|
||||
mergeRequestDiffs: state => state.diffs.mergeRequestDiffs,
|
||||
mergeRequestDiff: state => state.diffs.mergeRequestDiff,
|
||||
latestVersionPath: state => state.diffs.latestVersionPath,
|
||||
startVersion: state => state.diffs.startVersion,
|
||||
commit: state => state.diffs.commit,
|
||||
targetBranchName: state => state.diffs.targetBranchName,
|
||||
renderOverflowWarning: state => state.diffs.renderOverflowWarning,
|
||||
|
@ -75,26 +83,8 @@ export default {
|
|||
path: '',
|
||||
};
|
||||
},
|
||||
notAllCommentsDisplayed() {
|
||||
if (this.commit) {
|
||||
return __('Only comments from the following commit are shown below');
|
||||
} else if (this.startVersion) {
|
||||
return __(
|
||||
"Not all comments are displayed because you're comparing two versions of the diff.",
|
||||
);
|
||||
}
|
||||
return __(
|
||||
"Not all comments are displayed because you're viewing an old version of the diff.",
|
||||
);
|
||||
},
|
||||
showLatestVersion() {
|
||||
if (this.commit) {
|
||||
return __('Show latest version of the diff');
|
||||
}
|
||||
return __('Show latest version');
|
||||
},
|
||||
canCurrentUserFork() {
|
||||
return this.currentUser.canFork === true && this.currentUser.canCreateMergeRequest;
|
||||
return this.currentUser.can_fork === true && this.currentUser.can_create_merge_request;
|
||||
},
|
||||
showCompareVersions() {
|
||||
return this.mergeRequestDiffs && this.mergeRequestDiff;
|
||||
|
@ -122,17 +112,25 @@ export default {
|
|||
if (this.shouldShow) {
|
||||
this.fetchData();
|
||||
}
|
||||
|
||||
const id = window && window.location && window.location.hash;
|
||||
|
||||
if (id) {
|
||||
this.setHighlightedRow(id.slice(1));
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.adjustView();
|
||||
eventHub.$once('fetchedNotesData', this.setDiscussions);
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['startTaskList']),
|
||||
...mapActions('diffs', [
|
||||
'setBaseConfig',
|
||||
'fetchDiffFiles',
|
||||
'startRenderDiffsQueue',
|
||||
'assignDiscussionsToDiff',
|
||||
'setHighlightedRow',
|
||||
]),
|
||||
fetchData() {
|
||||
this.fetchDiffFiles()
|
||||
|
@ -157,7 +155,13 @@ export default {
|
|||
if (this.isNotesFetched && !this.assignedDiscussions && !this.isLoading) {
|
||||
this.assignedDiscussions = true;
|
||||
|
||||
requestIdleCallback(() => this.assignDiscussionsToDiff(), { timeout: 1000 });
|
||||
requestIdleCallback(
|
||||
() =>
|
||||
this.assignDiscussionsToDiff()
|
||||
.then(this.$nextTick)
|
||||
.then(this.startTaskList),
|
||||
{ timeout: 1000 },
|
||||
);
|
||||
}
|
||||
},
|
||||
adjustView() {
|
||||
|
@ -174,23 +178,11 @@ export default {
|
|||
|
||||
<template>
|
||||
<div v-show="shouldShow">
|
||||
<div
|
||||
v-if="isLoading"
|
||||
class="loading"
|
||||
>
|
||||
<gl-loading-icon />
|
||||
</div>
|
||||
<div
|
||||
v-else
|
||||
id="diffs"
|
||||
:class="{ active: shouldShow }"
|
||||
class="diffs tab-pane"
|
||||
>
|
||||
<div v-if="isLoading" class="loading"><gl-loading-icon /></div>
|
||||
<div v-else id="diffs" :class="{ active: shouldShow }" class="diffs tab-pane">
|
||||
<compare-versions
|
||||
v-if="showCompareVersions"
|
||||
:merge-request-diffs="mergeRequestDiffs"
|
||||
:merge-request-diff="mergeRequestDiff"
|
||||
:start-version="startVersion"
|
||||
:target-branch="targetBranch"
|
||||
/>
|
||||
|
||||
|
@ -202,51 +194,24 @@ export default {
|
|||
:email-patch-path="emailPatchPath"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-if="commit || startVersion || (mergeRequestDiff && !mergeRequestDiff.latest)"
|
||||
class="mr-version-controls"
|
||||
>
|
||||
<div class="content-block comments-disabled-notif clearfix">
|
||||
<i class="fa fa-info-circle"></i>
|
||||
{{ notAllCommentsDisplayed }}
|
||||
<div class="pull-right">
|
||||
<a
|
||||
:href="latestVersionPath"
|
||||
class="btn btn-sm"
|
||||
>
|
||||
{{ showLatestVersion }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<commit-widget
|
||||
v-if="commit"
|
||||
:commit="commit"
|
||||
/>
|
||||
|
||||
<div
|
||||
:data-can-create-note="getNoteableData.current_user.can_create_note"
|
||||
class="files d-flex prepend-top-default"
|
||||
>
|
||||
<div
|
||||
v-show="showTreeList"
|
||||
class="diff-tree-list"
|
||||
>
|
||||
<tree-list />
|
||||
<div v-show="showTreeList" class="diff-tree-list"><tree-list /></div>
|
||||
<div class="diff-files-holder">
|
||||
<commit-widget v-if="commit" :commit="commit" />
|
||||
<template v-if="diffFiles.length > 0">
|
||||
<diff-file
|
||||
v-for="file in diffFiles"
|
||||
:key="file.newPath"
|
||||
:file="file"
|
||||
:help-page-path="helpPagePath"
|
||||
:can-current-user-fork="canCurrentUserFork"
|
||||
/>
|
||||
</template>
|
||||
<no-changes v-else />
|
||||
</div>
|
||||
<div
|
||||
v-if="diffFiles.length > 0"
|
||||
class="diff-files-holder"
|
||||
>
|
||||
<diff-file
|
||||
v-for="file in diffFiles"
|
||||
:key="file.newPath"
|
||||
:file="file"
|
||||
:can-current-user-fork="canCurrentUserFork"
|
||||
/>
|
||||
</div>
|
||||
<no-changes v-else />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<script>
|
||||
import tooltip from '~/vue_shared/directives/tooltip';
|
||||
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
||||
|
@ -21,9 +20,6 @@ import CommitPipelineStatus from '~/projects/tree/components/commit_pipeline_sta
|
|||
*
|
||||
*/
|
||||
export default {
|
||||
directives: {
|
||||
tooltip,
|
||||
},
|
||||
components: {
|
||||
UserAvatarLink,
|
||||
Icon,
|
||||
|
@ -40,15 +36,17 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
authorName() {
|
||||
return (this.commit.author && this.commit.author.name) || this.commit.authorName;
|
||||
return (this.commit.author && this.commit.author.name) || this.commit.author_name;
|
||||
},
|
||||
authorUrl() {
|
||||
return (
|
||||
(this.commit.author && this.commit.author.webUrl) || `mailto:${this.commit.authorEmail}`
|
||||
(this.commit.author && this.commit.author.web_url) || `mailto:${this.commit.author_email}`
|
||||
);
|
||||
},
|
||||
authorAvatar() {
|
||||
return (this.commit.author && this.commit.author.avatarUrl) || this.commit.authorGravatarUrl;
|
||||
return (
|
||||
(this.commit.author && this.commit.author.avatar_url) || this.commit.author_gravatar_url
|
||||
);
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -66,59 +64,41 @@ export default {
|
|||
<div class="commit-detail flex-list">
|
||||
<div class="commit-content qa-commit-content">
|
||||
<a
|
||||
:href="commit.commitUrl"
|
||||
:href="commit.commit_url"
|
||||
class="commit-row-message item-title"
|
||||
v-html="commit.titleHtml"
|
||||
v-html="commit.title_html"
|
||||
></a>
|
||||
|
||||
<span class="commit-row-message d-block d-sm-none">
|
||||
·
|
||||
{{ commit.shortId }}
|
||||
</span>
|
||||
<span class="commit-row-message d-block d-sm-none"> · {{ commit.short_id }} </span>
|
||||
|
||||
<button
|
||||
v-if="commit.descriptionHtml"
|
||||
v-if="commit.description_html"
|
||||
class="text-expander js-toggle-button"
|
||||
type="button"
|
||||
:aria-label="__('Toggle commit description')"
|
||||
>
|
||||
<icon
|
||||
:size="12"
|
||||
name="ellipsis_h"
|
||||
/>
|
||||
<icon :size="12" name="ellipsis_h" />
|
||||
</button>
|
||||
|
||||
<div class="commiter">
|
||||
<a
|
||||
:href="authorUrl"
|
||||
v-text="authorName"
|
||||
></a>
|
||||
{{ s__('CommitWidget|authored') }}
|
||||
<time-ago-tooltip
|
||||
:time="commit.authoredDate"
|
||||
/>
|
||||
<a :href="authorUrl" v-text="authorName"></a> {{ s__('CommitWidget|authored') }}
|
||||
<time-ago-tooltip :time="commit.authored_date" />
|
||||
</div>
|
||||
|
||||
<pre
|
||||
v-if="commit.descriptionHtml"
|
||||
v-if="commit.description_html"
|
||||
class="commit-row-description js-toggle-content append-bottom-8"
|
||||
v-html="commit.descriptionHtml"
|
||||
v-html="commit.description_html"
|
||||
></pre>
|
||||
</div>
|
||||
<div class="commit-actions flex-row d-none d-sm-flex">
|
||||
<div
|
||||
v-if="commit.signatureHtml"
|
||||
v-html="commit.signatureHtml"
|
||||
></div>
|
||||
<div v-if="commit.signature_html" v-html="commit.signature_html"></div>
|
||||
<commit-pipeline-status
|
||||
v-if="commit.pipelineStatusPath"
|
||||
:endpoint="commit.pipelineStatusPath"
|
||||
v-if="commit.pipeline_status_path"
|
||||
:endpoint="commit.pipeline_status_path"
|
||||
/>
|
||||
<div class="commit-sha-group">
|
||||
<div
|
||||
class="label label-monospace"
|
||||
v-text="commit.shortId"
|
||||
></div>
|
||||
<div class="label label-monospace" v-text="commit.short_id"></div>
|
||||
<clipboard-button
|
||||
:text="commit.id"
|
||||
:title="__('Copy commit SHA to clipboard')"
|
||||
|
|
|
@ -28,12 +28,10 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="info-well prepend-top-default">
|
||||
<div class="info-well w-100">
|
||||
<div class="well-segment">
|
||||
<ul class="blob-commit-info">
|
||||
<commit-item
|
||||
:commit="commit"
|
||||
/>
|
||||
<commit-item :commit="commit" />
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script>
|
||||
import { mapActions, mapGetters, mapState } from 'vuex';
|
||||
import Tooltip from '@gitlab-org/gitlab-ui/dist/directives/tooltip';
|
||||
import { GlTooltipDirective, GlLink, GlButton } from '@gitlab/ui';
|
||||
import { __ } from '~/locale';
|
||||
import { getParameterValues, mergeUrlParams } from '~/lib/utils/url_utility';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
|
@ -10,9 +10,11 @@ export default {
|
|||
components: {
|
||||
CompareVersionsDropdown,
|
||||
Icon,
|
||||
GlLink,
|
||||
GlButton,
|
||||
},
|
||||
directives: {
|
||||
Tooltip,
|
||||
GlTooltip: GlTooltipDirective,
|
||||
},
|
||||
props: {
|
||||
mergeRequestDiffs: {
|
||||
|
@ -20,13 +22,9 @@ export default {
|
|||
required: true,
|
||||
},
|
||||
mergeRequestDiff: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
startVersion: {
|
||||
type: Object,
|
||||
required: false,
|
||||
default: null,
|
||||
default: () => ({}),
|
||||
},
|
||||
targetBranch: {
|
||||
type: Object,
|
||||
|
@ -35,7 +33,7 @@ export default {
|
|||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState('diffs', ['commit', 'showTreeList']),
|
||||
...mapState('diffs', ['commit', 'showTreeList', 'startVersion', 'latestVersionPath']),
|
||||
...mapGetters('diffs', ['isInlineView', 'isParallelView', 'hasCollapsedFile']),
|
||||
comparableDiffs() {
|
||||
return this.mergeRequestDiffs.slice(1);
|
||||
|
@ -73,27 +71,20 @@ export default {
|
|||
|
||||
<template>
|
||||
<div class="mr-version-controls">
|
||||
<div
|
||||
class="mr-version-menus-container content-block"
|
||||
>
|
||||
<div class="mr-version-menus-container content-block">
|
||||
<button
|
||||
v-tooltip.hover
|
||||
v-gl-tooltip.hover
|
||||
type="button"
|
||||
class="btn btn-default append-right-8 js-toggle-tree-list"
|
||||
:class="{
|
||||
active: showTreeList
|
||||
active: showTreeList,
|
||||
}"
|
||||
:title="__('Toggle file browser')"
|
||||
@click="toggleShowTreeList"
|
||||
>
|
||||
<icon
|
||||
name="hamburger"
|
||||
/>
|
||||
<icon name="hamburger" />
|
||||
</button>
|
||||
<div
|
||||
v-if="showDropdowns"
|
||||
class="d-flex align-items-center compare-versions-container"
|
||||
>
|
||||
<div v-if="showDropdowns" class="d-flex align-items-center compare-versions-container">
|
||||
Changes between
|
||||
<compare-versions-dropdown
|
||||
:other-versions="mergeRequestDiffs"
|
||||
|
@ -109,20 +100,22 @@ export default {
|
|||
class="mr-version-compare-dropdown"
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
class="inline-parallel-buttons d-none d-md-flex ml-auto"
|
||||
>
|
||||
<a
|
||||
v-show="hasCollapsedFile"
|
||||
class="btn btn-default append-right-8"
|
||||
@click="expandAllFiles"
|
||||
<div v-else-if="commit">
|
||||
{{ __('Viewing commit') }}
|
||||
<gl-link :href="commit.commit_url" class="monospace">{{ commit.short_id }}</gl-link>
|
||||
</div>
|
||||
<div class="inline-parallel-buttons d-none d-md-flex ml-auto">
|
||||
<gl-button
|
||||
v-if="commit || startVersion"
|
||||
:href="latestVersionPath"
|
||||
class="append-right-8 js-latest-version"
|
||||
>
|
||||
{{ __('Show latest version') }}
|
||||
</gl-button>
|
||||
<a v-show="hasCollapsedFile" class="btn btn-default append-right-8" @click="expandAllFiles">
|
||||
{{ __('Expand all') }}
|
||||
</a>
|
||||
<a
|
||||
:href="toggleWhitespacePath"
|
||||
class="btn btn-default qa-toggle-whitespace"
|
||||
>
|
||||
<a :href="toggleWhitespacePath" class="btn btn-default qa-toggle-whitespace">
|
||||
{{ toggleWhitespaceText }}
|
||||
</a>
|
||||
<div class="btn-group prepend-left-8">
|
||||
|
|
|
@ -56,16 +56,16 @@ export default {
|
|||
methods: {
|
||||
commitsText(version) {
|
||||
return n__(
|
||||
`${version.commitsCount} commit,`,
|
||||
`${version.commitsCount} commits,`,
|
||||
version.commitsCount,
|
||||
`${version.commits_count} commit,`,
|
||||
`${version.commits_count} commits,`,
|
||||
version.commits_count,
|
||||
);
|
||||
},
|
||||
href(version) {
|
||||
if (this.showCommitCount) {
|
||||
return version.versionPath;
|
||||
return version.version_path;
|
||||
}
|
||||
return version.comparePath;
|
||||
return version.compare_path;
|
||||
},
|
||||
versionName(version) {
|
||||
if (this.isLatest(version)) {
|
||||
|
@ -74,7 +74,7 @@ export default {
|
|||
if (this.targetBranch && (this.isBase(version) || !version)) {
|
||||
return this.targetBranch.branchName;
|
||||
}
|
||||
return `version ${version.versionIndex}`;
|
||||
return `version ${version.version_index}`;
|
||||
},
|
||||
isActive(version) {
|
||||
if (!version) {
|
||||
|
@ -84,11 +84,11 @@ export default {
|
|||
if (this.targetBranch) {
|
||||
return (
|
||||
(this.isBase(version) && !this.startVersion) ||
|
||||
(this.startVersion && this.startVersion.versionIndex === version.versionIndex)
|
||||
(this.startVersion && this.startVersion.version_index === version.version_index)
|
||||
);
|
||||
}
|
||||
|
||||
return version.versionIndex === this.mergeRequestVersion.versionIndex;
|
||||
return version.version_index === this.mergeRequestVersion.version_index;
|
||||
},
|
||||
isBase(version) {
|
||||
if (!version || !this.targetBranch) {
|
||||
|
@ -98,7 +98,7 @@ export default {
|
|||
},
|
||||
isLatest(version) {
|
||||
return (
|
||||
this.mergeRequestVersion && version.versionIndex === this.targetVersions[0].versionIndex
|
||||
this.mergeRequestVersion && version.version_index === this.targetVersions[0].version_index
|
||||
);
|
||||
},
|
||||
},
|
||||
|
@ -112,26 +112,14 @@ export default {
|
|||
data-toggle="dropdown"
|
||||
aria-expanded="false"
|
||||
>
|
||||
<span>
|
||||
{{ selectedVersionName }}
|
||||
</span>
|
||||
<icon
|
||||
:size="12"
|
||||
name="angle-down"
|
||||
class="position-absolute"
|
||||
/>
|
||||
<span> {{ selectedVersionName }} </span>
|
||||
<icon :size="12" name="angle-down" class="position-absolute" />
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-select dropdown-menu-selectable">
|
||||
<div class="dropdown-content">
|
||||
<ul>
|
||||
<li
|
||||
v-for="version in targetVersions"
|
||||
:key="version.id"
|
||||
>
|
||||
<a
|
||||
:class="{ 'is-active': isActive(version) }"
|
||||
:href="href(version)"
|
||||
>
|
||||
<li v-for="version in targetVersions" :key="version.id">
|
||||
<a :class="{ 'is-active': isActive(version) }" :href="href(version)">
|
||||
<div>
|
||||
<strong>
|
||||
{{ versionName(version) }}
|
||||
|
@ -141,9 +129,7 @@ export default {
|
|||
</strong>
|
||||
</div>
|
||||
<div>
|
||||
<small class="commit-sha">
|
||||
{{ version.truncatedCommitSha }}
|
||||
</small>
|
||||
<small class="commit-sha"> {{ version.truncated_commit_sha }} </small>
|
||||
</div>
|
||||
<div>
|
||||
<small>
|
||||
|
@ -151,8 +137,8 @@ export default {
|
|||
{{ commitsText(version) }}
|
||||
</template>
|
||||
<time-ago
|
||||
v-if="version.createdAt"
|
||||
:time="version.createdAt"
|
||||
v-if="version.created_at"
|
||||
:time="version.created_at"
|
||||
class="js-timeago js-timeago-render"
|
||||
/>
|
||||
</small>
|
||||
|
|
|
@ -23,6 +23,11 @@ export default {
|
|||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
helpPagePath: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
|
@ -39,7 +44,7 @@ export default {
|
|||
return this.diffFile.viewer.name === 'text';
|
||||
},
|
||||
diffFileCommentForm() {
|
||||
return this.getCommentFormForDiffFile(this.diffFile.fileHash);
|
||||
return this.getCommentFormForDiffFile(this.diffFile.file_hash);
|
||||
},
|
||||
showNotesContainer() {
|
||||
return this.diffFile.discussions.length || this.diffFileCommentForm;
|
||||
|
@ -73,34 +78,35 @@ export default {
|
|||
<inline-diff-view
|
||||
v-if="isInlineView"
|
||||
:diff-file="diffFile"
|
||||
:diff-lines="diffFile.highlightedDiffLines || []"
|
||||
:diff-lines="diffFile.highlighted_diff_lines || []"
|
||||
:help-page-path="helpPagePath"
|
||||
/>
|
||||
<parallel-diff-view
|
||||
v-if="isParallelView"
|
||||
:diff-file="diffFile"
|
||||
:diff-lines="diffFile.parallelDiffLines || []"
|
||||
:diff-lines="diffFile.parallel_diff_lines || []"
|
||||
:help-page-path="helpPagePath"
|
||||
/>
|
||||
</template>
|
||||
<diff-viewer
|
||||
v-else
|
||||
:diff-mode="diffMode"
|
||||
:new-path="diffFile.newPath"
|
||||
:new-sha="diffFile.diffRefs.headSha"
|
||||
:old-path="diffFile.oldPath"
|
||||
:old-sha="diffFile.diffRefs.baseSha"
|
||||
:file-hash="diffFile.fileHash"
|
||||
:new-path="diffFile.new_path"
|
||||
:new-sha="diffFile.diff_refs.head_sha"
|
||||
:old-path="diffFile.old_path"
|
||||
:old-sha="diffFile.diff_refs.base_sha"
|
||||
:file-hash="diffFile.file_hash"
|
||||
:project-path="projectPath"
|
||||
:a-mode="diffFile.a_mode"
|
||||
:b-mode="diffFile.b_mode"
|
||||
>
|
||||
<image-diff-overlay
|
||||
slot="image-overlay"
|
||||
:discussions="diffFile.discussions"
|
||||
:file-hash="diffFile.fileHash"
|
||||
:file-hash="diffFile.file_hash"
|
||||
:can-comment="getNoteableData.current_user.can_create_note"
|
||||
/>
|
||||
<div
|
||||
v-if="showNotesContainer"
|
||||
class="note-container"
|
||||
>
|
||||
<div v-if="showNotesContainer" class="note-container">
|
||||
<diff-discussions
|
||||
v-if="diffFile.discussions.length"
|
||||
class="diff-file-discussions"
|
||||
|
@ -115,8 +121,8 @@ export default {
|
|||
:save-button-title="__('Comment')"
|
||||
class="diff-comment-form new-note discussion-form discussion-form-container"
|
||||
@handleFormUpdate="handleSaveNote"
|
||||
@cancelForm="closeDiffFileCommentForm(diffFile.fileHash)"
|
||||
/>
|
||||
@cancelForm="closeDiffFileCommentForm(diffFile.file_hash);"
|
||||
/>
|
||||
</div>
|
||||
</diff-viewer>
|
||||
</div>
|
||||
|
|
|
@ -13,6 +13,11 @@ export default {
|
|||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
line: {
|
||||
type: Object,
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
shouldCollapseDiscussions: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
|
@ -23,6 +28,11 @@ export default {
|
|||
required: false,
|
||||
default: false,
|
||||
},
|
||||
helpPagePath: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions(['toggleDiscussion']),
|
||||
|
@ -45,29 +55,22 @@ export default {
|
|||
v-for="(discussion, index) in discussions"
|
||||
:key="discussion.id"
|
||||
:class="{
|
||||
collapsed: !isExpanded(discussion)
|
||||
collapsed: !isExpanded(discussion),
|
||||
}"
|
||||
class="discussion-notes diff-discussions position-relative"
|
||||
>
|
||||
<ul
|
||||
:data-discussion-id="discussion.id"
|
||||
class="notes"
|
||||
>
|
||||
<ul :data-discussion-id="discussion.id" class="notes">
|
||||
<template v-if="shouldCollapseDiscussions">
|
||||
<button
|
||||
:class="{
|
||||
'diff-notes-collapse': discussion.expanded,
|
||||
'btn-transparent badge badge-pill': !discussion.expanded
|
||||
'btn-transparent badge badge-pill': !discussion.expanded,
|
||||
}"
|
||||
type="button"
|
||||
class="js-diff-notes-toggle"
|
||||
@click="toggleDiscussion({ discussionId: discussion.id })"
|
||||
@click="toggleDiscussion({ discussionId: discussion.id });"
|
||||
>
|
||||
<icon
|
||||
v-if="discussion.expanded"
|
||||
name="collapse"
|
||||
class="collapse-icon"
|
||||
/>
|
||||
<icon v-if="discussion.expanded" name="collapse" class="collapse-icon" />
|
||||
<template v-else>
|
||||
{{ index + 1 }}
|
||||
</template>
|
||||
|
@ -79,13 +82,11 @@ export default {
|
|||
:render-diff-file="false"
|
||||
:always-expanded="true"
|
||||
:discussions-by-diff-order="true"
|
||||
:line="line"
|
||||
:help-page-path="helpPagePath"
|
||||
@noteDeleted="deleteNoteHandler"
|
||||
>
|
||||
<span
|
||||
v-if="renderAvatarBadge"
|
||||
slot="avatar-badge"
|
||||
class="badge badge-pill"
|
||||
>
|
||||
<span v-if="renderAvatarBadge" slot="avatar-badge" class="badge badge-pill">
|
||||
{{ index + 1 }}
|
||||
</span>
|
||||
</noteable-discussion>
|
||||
|
|
|
@ -3,7 +3,8 @@ import { mapActions, mapGetters, mapState } from 'vuex';
|
|||
import _ from 'underscore';
|
||||
import { __, sprintf } from '~/locale';
|
||||
import createFlash from '~/flash';
|
||||
import { GlLoadingIcon } from '@gitlab-org/gitlab-ui';
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import eventHub from '../../notes/event_hub';
|
||||
import DiffFileHeader from './diff_file_header.vue';
|
||||
import DiffContent from './diff_content.vue';
|
||||
|
||||
|
@ -22,6 +23,11 @@ export default {
|
|||
type: Boolean,
|
||||
required: true,
|
||||
},
|
||||
helpPagePath: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: '',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
@ -40,7 +46,7 @@ export default {
|
|||
return sprintf(
|
||||
__('You can %{linkStart}view the blob%{linkEnd} instead.'),
|
||||
{
|
||||
linkStart: `<a href="${_.escape(this.file.viewPath)}">`,
|
||||
linkStart: `<a href="${_.escape(this.file.view_path)}">`,
|
||||
linkEnd: '</a>',
|
||||
},
|
||||
false,
|
||||
|
@ -49,19 +55,23 @@ export default {
|
|||
showExpandMessage() {
|
||||
return (
|
||||
this.isCollapsed ||
|
||||
(!this.file.highlightedDiffLines &&
|
||||
(!this.file.highlighted_diff_lines &&
|
||||
!this.isLoadingCollapsedDiff &&
|
||||
!this.file.tooLarge &&
|
||||
this.file.text)
|
||||
!this.file.too_large &&
|
||||
this.file.text &&
|
||||
!this.file.renamed_file &&
|
||||
!this.file.mode_changed)
|
||||
);
|
||||
},
|
||||
showLoadingIcon() {
|
||||
return this.isLoadingCollapsedDiff || (!this.file.renderIt && !this.isCollapsed);
|
||||
},
|
||||
hasDiffLines() {
|
||||
const { highlightedDiffLines, parallelDiffLines } = this.file;
|
||||
|
||||
return highlightedDiffLines && parallelDiffLines && parallelDiffLines.length > 0;
|
||||
return (
|
||||
this.file.highlighted_diff_lines &&
|
||||
this.file.parallel_diff_lines &&
|
||||
this.file.parallel_diff_lines.length > 0
|
||||
);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
|
@ -71,6 +81,9 @@ export default {
|
|||
}
|
||||
},
|
||||
},
|
||||
created() {
|
||||
eventHub.$on(`loadCollapsedDiff/${this.file.file_hash}`, this.handleLoadCollapsedDiff);
|
||||
},
|
||||
methods: {
|
||||
...mapActions('diffs', ['loadCollapsedDiff', 'assignDiscussionsToDiff']),
|
||||
handleToggle() {
|
||||
|
@ -115,9 +128,9 @@ export default {
|
|||
|
||||
<template>
|
||||
<div
|
||||
:id="file.fileHash"
|
||||
:id="file.file_hash"
|
||||
:class="{
|
||||
'is-active': currentDiffFileId === file.fileHash
|
||||
'is-active': currentDiffFileId === file.file_hash,
|
||||
}"
|
||||
class="diff-file file-holder"
|
||||
>
|
||||
|
@ -132,20 +145,17 @@ export default {
|
|||
@showForkMessage="showForkMessage"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-if="forkMessageVisible"
|
||||
class="js-file-fork-suggestion-section file-fork-suggestion">
|
||||
<div v-if="forkMessageVisible" class="js-file-fork-suggestion-section file-fork-suggestion">
|
||||
<span class="file-fork-suggestion-note">
|
||||
You're not allowed to <span class="js-file-fork-suggestion-section-action">edit</span>
|
||||
files in this project directly. Please fork this project,
|
||||
make your changes there, and submit a merge request.
|
||||
You're not allowed to <span class="js-file-fork-suggestion-section-action">edit</span> files
|
||||
in this project directly. Please fork this project, make your changes there, and submit a
|
||||
merge request.
|
||||
</span>
|
||||
<a
|
||||
:href="file.forkPath"
|
||||
:href="file.fork_path"
|
||||
class="js-fork-suggestion-button btn btn-grouped btn-inverted btn-success"
|
||||
>Fork</a
|
||||
>
|
||||
Fork
|
||||
</a>
|
||||
<button
|
||||
class="js-cancel-fork-suggestion-button btn btn-grouped"
|
||||
type="button"
|
||||
|
@ -157,30 +167,18 @@ export default {
|
|||
|
||||
<diff-content
|
||||
v-if="!isCollapsed && file.renderIt"
|
||||
:class="{ hidden: isCollapsed || file.tooLarge }"
|
||||
:class="{ hidden: isCollapsed || file.too_large }"
|
||||
:diff-file="file"
|
||||
:help-page-path="helpPagePath"
|
||||
/>
|
||||
<gl-loading-icon
|
||||
v-if="showLoadingIcon"
|
||||
class="diff-content loading"
|
||||
/>
|
||||
<div
|
||||
v-else-if="showExpandMessage"
|
||||
class="nothing-here-block diff-collapsed"
|
||||
>
|
||||
<gl-loading-icon v-if="showLoadingIcon" class="diff-content loading" />
|
||||
<div v-else-if="showExpandMessage" class="nothing-here-block diff-collapsed">
|
||||
{{ __('This diff is collapsed.') }}
|
||||
<a
|
||||
class="click-to-expand js-click-to-expand"
|
||||
href="#"
|
||||
@click.prevent="handleToggle"
|
||||
>
|
||||
{{ __('Click to expand it.') }}
|
||||
</a>
|
||||
<a class="click-to-expand js-click-to-expand" href="#" @click.prevent="handleToggle">{{
|
||||
__('Click to expand it.')
|
||||
}}</a>
|
||||
</div>
|
||||
<div
|
||||
v-if="file.tooLarge"
|
||||
class="nothing-here-block diff-collapsed js-too-large-diff"
|
||||
>
|
||||
<div v-if="file.too_large" class="nothing-here-block diff-collapsed js-too-large-diff">
|
||||
{{ __('This source diff could not be displayed because it is too large.') }}
|
||||
<span v-html="viewBlobLink"></span>
|
||||
</div>
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
<script>
|
||||
import _ from 'underscore';
|
||||
import { mapActions, mapGetters } from 'vuex';
|
||||
import { polyfillSticky } from '~/lib/utils/sticky';
|
||||
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
|
||||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import FileIcon from '~/vue_shared/components/file_icon.vue';
|
||||
import Tooltip from '~/vue_shared/directives/tooltip';
|
||||
import { GlTooltipDirective } from '@gitlab/ui';
|
||||
import { truncateSha } from '~/lib/utils/text_utility';
|
||||
import { __, s__, sprintf } from '~/locale';
|
||||
import EditButton from './edit_button.vue';
|
||||
|
@ -17,7 +18,7 @@ export default {
|
|||
FileIcon,
|
||||
},
|
||||
directives: {
|
||||
Tooltip,
|
||||
GlTooltip: GlTooltipDirective,
|
||||
},
|
||||
props: {
|
||||
discussionPath: {
|
||||
|
@ -68,32 +69,32 @@ export default {
|
|||
},
|
||||
titleLink() {
|
||||
if (this.diffFile.submodule) {
|
||||
return this.diffFile.submoduleTreeUrl || this.diffFile.submoduleLink;
|
||||
return this.diffFile.submodule_tree_url || this.diffFile.submodule_link;
|
||||
}
|
||||
return this.discussionPath;
|
||||
},
|
||||
filePath() {
|
||||
if (this.diffFile.submodule) {
|
||||
return `${this.diffFile.filePath} @ ${truncateSha(this.diffFile.blob.id)}`;
|
||||
return `${this.diffFile.file_path} @ ${truncateSha(this.diffFile.blob.id)}`;
|
||||
}
|
||||
|
||||
if (this.diffFile.deletedFile) {
|
||||
return sprintf(__('%{filePath} deleted'), { filePath: this.diffFile.filePath }, false);
|
||||
if (this.diffFile.deleted_file) {
|
||||
return sprintf(__('%{filePath} deleted'), { filePath: this.diffFile.file_path }, false);
|
||||
}
|
||||
|
||||
return this.diffFile.filePath;
|
||||
return this.diffFile.file_path;
|
||||
},
|
||||
titleTag() {
|
||||
return this.diffFile.fileHash ? 'a' : 'span';
|
||||
return this.diffFile.file_hash ? 'a' : 'span';
|
||||
},
|
||||
isUsingLfs() {
|
||||
return this.diffFile.storedExternally && this.diffFile.externalStorage === 'lfs';
|
||||
return this.diffFile.stored_externally && this.diffFile.external_storage === 'lfs';
|
||||
},
|
||||
collapseIcon() {
|
||||
return this.expanded ? 'chevron-down' : 'chevron-right';
|
||||
},
|
||||
viewFileButtonText() {
|
||||
const truncatedContentSha = _.escape(truncateSha(this.diffFile.contentSha));
|
||||
const truncatedContentSha = _.escape(truncateSha(this.diffFile.content_sha));
|
||||
return sprintf(
|
||||
s__('MergeRequests|View file @ %{commitId}'),
|
||||
{
|
||||
|
@ -103,7 +104,7 @@ export default {
|
|||
);
|
||||
},
|
||||
viewReplacedFileButtonText() {
|
||||
const truncatedBaseSha = _.escape(truncateSha(this.diffFile.diffRefs.baseSha));
|
||||
const truncatedBaseSha = _.escape(truncateSha(this.diffFile.diff_refs.base_sha));
|
||||
return sprintf(
|
||||
s__('MergeRequests|View replaced file @ %{commitId}'),
|
||||
{
|
||||
|
@ -113,9 +114,12 @@ export default {
|
|||
);
|
||||
},
|
||||
gfmCopyText() {
|
||||
return `\`${this.diffFile.filePath}\``;
|
||||
return `\`${this.diffFile.file_path}\``;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
polyfillSticky(this.$refs.header);
|
||||
},
|
||||
methods: {
|
||||
...mapActions('diffs', ['toggleFileDiscussions']),
|
||||
handleToggleFile(e, checkTarget) {
|
||||
|
@ -141,7 +145,7 @@ export default {
|
|||
<div
|
||||
ref="header"
|
||||
class="js-file-title file-title file-title-flex-parent"
|
||||
@click="handleToggleFile($event, true)"
|
||||
@click="handleToggleFile($event, true);"
|
||||
>
|
||||
<div class="file-header-content">
|
||||
<icon
|
||||
|
@ -152,76 +156,53 @@ export default {
|
|||
class="diff-toggle-caret append-right-5"
|
||||
@click.stop="handleToggle"
|
||||
/>
|
||||
<a
|
||||
v-once
|
||||
ref="titleWrapper"
|
||||
:href="titleLink"
|
||||
class="append-right-4 js-title-wrapper"
|
||||
>
|
||||
<a v-once ref="titleWrapper" :href="titleLink" class="append-right-4 js-title-wrapper">
|
||||
<file-icon
|
||||
:file-name="filePath"
|
||||
:size="18"
|
||||
aria-hidden="true"
|
||||
css-classes="js-file-icon append-right-5"
|
||||
/>
|
||||
<span v-if="diffFile.renamedFile">
|
||||
<span v-if="diffFile.renamed_file">
|
||||
<strong
|
||||
v-tooltip
|
||||
:title="diffFile.oldPath"
|
||||
v-gl-tooltip
|
||||
:title="diffFile.old_path"
|
||||
class="file-title-name"
|
||||
data-container="body"
|
||||
v-html="diffFile.oldPathHtml"
|
||||
v-html="diffFile.old_path_html"
|
||||
></strong>
|
||||
→
|
||||
<strong
|
||||
v-tooltip
|
||||
:title="diffFile.newPath"
|
||||
v-gl-tooltip
|
||||
:title="diffFile.new_path"
|
||||
class="file-title-name"
|
||||
data-container="body"
|
||||
v-html="diffFile.newPathHtml"
|
||||
v-html="diffFile.new_path_html"
|
||||
></strong>
|
||||
</span>
|
||||
|
||||
<strong
|
||||
v-else
|
||||
v-tooltip
|
||||
:title="filePath"
|
||||
class="file-title-name"
|
||||
data-container="body"
|
||||
>
|
||||
<strong v-else v-gl-tooltip :title="filePath" class="file-title-name" data-container="body">
|
||||
{{ filePath }}
|
||||
</strong>
|
||||
</a>
|
||||
|
||||
<clipboard-button
|
||||
:title="__('Copy file path to clipboard')"
|
||||
:text="diffFile.filePath"
|
||||
:text="diffFile.file_path"
|
||||
:gfm="gfmCopyText"
|
||||
css-class="btn-default btn-transparent btn-clipboard"
|
||||
/>
|
||||
|
||||
<small
|
||||
v-if="diffFile.modeChanged"
|
||||
ref="fileMode"
|
||||
>
|
||||
{{ diffFile.aMode }} → {{ diffFile.bMode }}
|
||||
<small v-if="diffFile.mode_changed" ref="fileMode">
|
||||
{{ diffFile.a_mode }} → {{ diffFile.b_mode }}
|
||||
</small>
|
||||
|
||||
<span
|
||||
v-if="isUsingLfs"
|
||||
class="label label-lfs append-right-5"
|
||||
>
|
||||
{{ __('LFS') }}
|
||||
</span>
|
||||
<span v-if="isUsingLfs" class="label label-lfs append-right-5"> {{ __('LFS') }} </span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="!diffFile.submodule && addMergeRequestButtons"
|
||||
class="file-actions d-none d-sm-block"
|
||||
>
|
||||
<template
|
||||
v-if="diffFile.blob && diffFile.blob.readableText"
|
||||
>
|
||||
<template v-if="diffFile.blob && diffFile.blob.readable_text">
|
||||
<button
|
||||
:disabled="!diffHasDiscussions(diffFile)"
|
||||
:class="{ active: hasExpandedDiscussions }"
|
||||
|
@ -234,33 +215,29 @@ export default {
|
|||
</button>
|
||||
|
||||
<edit-button
|
||||
v-if="!diffFile.deletedFile"
|
||||
v-if="!diffFile.deleted_file"
|
||||
:can-current-user-fork="canCurrentUserFork"
|
||||
:edit-path="diffFile.editPath"
|
||||
:can-modify-blob="diffFile.canModifyBlob"
|
||||
:edit-path="diffFile.edit_path"
|
||||
:can-modify-blob="diffFile.can_modify_blob"
|
||||
@showForkMessage="showForkMessage"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<a
|
||||
v-if="diffFile.replacedViewPath"
|
||||
:href="diffFile.replacedViewPath"
|
||||
v-if="diffFile.replaced_view_path"
|
||||
:href="diffFile.replaced_view_path"
|
||||
class="btn view-file js-view-file"
|
||||
v-html="viewReplacedFileButtonText"
|
||||
>
|
||||
</a>
|
||||
<a
|
||||
:href="diffFile.viewPath"
|
||||
class="btn view-file js-view-file"
|
||||
v-html="viewFileButtonText"
|
||||
>
|
||||
<a :href="diffFile.view_path" class="btn view-file js-view-file" v-html="viewFileButtonText">
|
||||
</a>
|
||||
|
||||
<a
|
||||
v-if="diffFile.externalUrl"
|
||||
v-tooltip
|
||||
:href="diffFile.externalUrl"
|
||||
:title="`View on ${diffFile.formattedExternalUrl}`"
|
||||
v-if="diffFile.external_url"
|
||||
v-gl-tooltip.hover
|
||||
:href="diffFile.external_url"
|
||||
:title="`View on ${diffFile.formatted_external_url}`"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="btn btn-file-option"
|
||||
|
|
|
@ -3,7 +3,7 @@ import { mapActions } from 'vuex';
|
|||
import Icon from '~/vue_shared/components/icon.vue';
|
||||
import { pluralize, truncate } from '~/lib/utils/text_utility';
|
||||
import UserAvatarImage from '~/vue_shared/components/user_avatar/user_avatar_image.vue';
|
||||
import { GlTooltipDirective } from '@gitlab-org/gitlab-ui';
|
||||
import { GlTooltipDirective } from '@gitlab/ui';
|
||||
import { COUNT_OF_AVATARS_IN_GUTTER, LENGTH_OF_AVATAR_TOOLTIP } from '../constants';
|
||||
|
||||
export default {
|
||||
|
@ -56,9 +56,12 @@ export default {
|
|||
return `${noteData.author.name}: ${note}`;
|
||||
},
|
||||
toggleDiscussions() {
|
||||
const forceExpanded = this.discussions.some(discussion => !discussion.expanded);
|
||||
|
||||
this.discussions.forEach(discussion => {
|
||||
this.toggleDiscussion({
|
||||
discussionId: discussion.id,
|
||||
forceExpanded,
|
||||
});
|
||||
});
|
||||
},
|
||||
|
@ -75,10 +78,7 @@ export default {
|
|||
class="diff-notes-collapse js-diff-comment-avatar js-diff-comment-button"
|
||||
@click="toggleDiscussions"
|
||||
>
|
||||
<icon
|
||||
:size="12"
|
||||
name="collapse"
|
||||
/>
|
||||
<icon :size="12" name="collapse" />
|
||||
</button>
|
||||
<template v-else>
|
||||
<user-avatar-image
|
||||
|
@ -99,7 +99,8 @@ export default {
|
|||
data-placement="top"
|
||||
role="button"
|
||||
@click="toggleDiscussions"
|
||||
>+{{ moreCount }}</span>
|
||||
>+{{ moreCount }}</span
|
||||
>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -72,8 +72,15 @@ export default {
|
|||
diffFiles: state => state.diffs.diffFiles,
|
||||
}),
|
||||
...mapGetters(['isLoggedIn']),
|
||||
lineCode() {
|
||||
return (
|
||||
this.line.line_code ||
|
||||
(this.line.left && this.line.line.left.line_code) ||
|
||||
(this.line.right && this.line.right.line_code)
|
||||
);
|
||||
},
|
||||
lineHref() {
|
||||
return `#${this.line.lineCode || ''}`;
|
||||
return `#${this.line.line_code || ''}`;
|
||||
},
|
||||
shouldShowCommentButton() {
|
||||
return (
|
||||
|
@ -97,9 +104,9 @@ export default {
|
|||
},
|
||||
},
|
||||
methods: {
|
||||
...mapActions('diffs', ['loadMoreLines', 'showCommentForm']),
|
||||
...mapActions('diffs', ['loadMoreLines', 'showCommentForm', 'setHighlightedRow']),
|
||||
handleCommentButton() {
|
||||
this.showCommentForm({ lineCode: this.line.lineCode });
|
||||
this.showCommentForm({ lineCode: this.line.line_code, fileHash: this.fileHash });
|
||||
},
|
||||
handleLoadMoreLines() {
|
||||
if (this.isRequesting) {
|
||||
|
@ -108,8 +115,8 @@ export default {
|
|||
|
||||
this.isRequesting = true;
|
||||
const endpoint = this.contextLinesPath;
|
||||
const oldLineNumber = this.line.metaData.oldPos || 0;
|
||||
const newLineNumber = this.line.metaData.newPos || 0;
|
||||
const oldLineNumber = this.line.meta_data.old_pos || 0;
|
||||
const newLineNumber = this.line.meta_data.new_pos || 0;
|
||||
const offset = newLineNumber - oldLineNumber;
|
||||
const bottom = this.isBottom;
|
||||
const { fileHash } = this;
|
||||
|
@ -125,12 +132,12 @@ export default {
|
|||
to = lineNumber + UNFOLD_COUNT;
|
||||
} else {
|
||||
const diffFile = utils.findDiffFile(this.diffFiles, this.fileHash);
|
||||
const indexForInline = utils.findIndexInInlineLines(diffFile.highlightedDiffLines, {
|
||||
const indexForInline = utils.findIndexInInlineLines(diffFile.highlighted_diff_lines, {
|
||||
oldLineNumber,
|
||||
newLineNumber,
|
||||
});
|
||||
const prevLine = diffFile.highlightedDiffLines[indexForInline - 2];
|
||||
const prevLineNumber = (prevLine && prevLine.newLine) || 0;
|
||||
const prevLine = diffFile.highlighted_diff_lines[indexForInline - 2];
|
||||
const prevLineNumber = (prevLine && prevLine.new_line) || 0;
|
||||
|
||||
if (since <= prevLineNumber + 1) {
|
||||
since = prevLineNumber + 1;
|
||||
|
@ -155,37 +162,27 @@ export default {
|
|||
|
||||
<template>
|
||||
<div>
|
||||
<span
|
||||
v-if="isMatchLine"
|
||||
class="context-cell"
|
||||
role="button"
|
||||
@click="handleLoadMoreLines"
|
||||
>...</span>
|
||||
<template
|
||||
v-else
|
||||
<span v-if="isMatchLine" class="context-cell" role="button" @click="handleLoadMoreLines"
|
||||
>...</span
|
||||
>
|
||||
<template v-else>
|
||||
<button
|
||||
v-if="shouldShowCommentButton"
|
||||
v-show="shouldShowCommentButton"
|
||||
type="button"
|
||||
class="add-diff-note js-add-diff-note-button qa-diff-comment"
|
||||
title="Add a comment to this line"
|
||||
@click="handleCommentButton"
|
||||
>
|
||||
<icon
|
||||
:size="12"
|
||||
name="comment"
|
||||
/>
|
||||
<icon :size="12" name="comment" />
|
||||
</button>
|
||||
<a
|
||||
v-if="lineNumber"
|
||||
:data-linenumber="lineNumber"
|
||||
:href="lineHref"
|
||||
@click="setHighlightedRow(lineCode);"
|
||||
>
|
||||
</a>
|
||||
<diff-gutter-avatars
|
||||
v-if="shouldShowAvatarsOnGutter"
|
||||
:discussions="line.discussions"
|
||||
/>
|
||||
<diff-gutter-avatars v-if="shouldShowAvatarsOnGutter" :discussions="line.discussions" />
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -53,7 +53,7 @@ export default {
|
|||
this.noteableData.diff_head_sha,
|
||||
DIFF_NOTE_TYPE,
|
||||
this.noteableData.source_project_id,
|
||||
this.line.lineCode,
|
||||
this.line.line_code,
|
||||
];
|
||||
|
||||
this.initAutoSave(this.noteableData, keys);
|
||||
|
@ -72,7 +72,8 @@ export default {
|
|||
}
|
||||
|
||||
this.cancelCommentForm({
|
||||
lineCode: this.line.lineCode,
|
||||
lineCode: this.line.line_code,
|
||||
fileHash: this.diffFileHash,
|
||||
});
|
||||
this.$nextTick(() => {
|
||||
this.resetAutoSave();
|
||||
|
@ -88,13 +89,12 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="content discussion-form discussion-form-container discussion-notes"
|
||||
>
|
||||
<div class="content discussion-form discussion-form-container discussion-notes">
|
||||
<note-form
|
||||
ref="noteForm"
|
||||
:is-editing="true"
|
||||
:line-code="line.lineCode"
|
||||
:line-code="line.line_code"
|
||||
:line="line"
|
||||
save-button-title="Comment"
|
||||
class="diff-comment-form"
|
||||
@cancelForm="handleCancelCommentForm"
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<script>
|
||||
import { mapGetters } from 'vuex';
|
||||
import { mapGetters, mapActions } from 'vuex';
|
||||
import DiffLineGutterContent from './diff_line_gutter_content.vue';
|
||||
import {
|
||||
MATCH_LINE_TYPE,
|
||||
|
@ -30,6 +30,11 @@ export default {
|
|||
type: String,
|
||||
required: true,
|
||||
},
|
||||
isHighlighted: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
diffViewType: {
|
||||
type: String,
|
||||
required: false,
|
||||
|
@ -85,6 +90,7 @@ export default {
|
|||
const { type } = this.line;
|
||||
|
||||
return {
|
||||
hll: this.isHighlighted,
|
||||
[type]: type,
|
||||
[LINE_UNFOLD_CLASS_NAME]: this.isMatchLine,
|
||||
[LINE_HOVER_CLASS_NAME]:
|
||||
|
@ -96,18 +102,15 @@ export default {
|
|||
};
|
||||
},
|
||||
lineNumber() {
|
||||
const { lineType } = this;
|
||||
|
||||
return lineType === OLD_LINE_TYPE ? this.line.oldLine : this.line.newLine;
|
||||
return this.lineType === OLD_LINE_TYPE ? this.line.old_line : this.line.new_line;
|
||||
},
|
||||
},
|
||||
methods: mapActions('diffs', ['setHighlightedRow']),
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<td
|
||||
:class="classNameMap"
|
||||
>
|
||||
<td :class="classNameMap">
|
||||
<diff-line-gutter-content
|
||||
:line="line"
|
||||
:file-hash="fileHash"
|
||||
|
|
|
@ -32,11 +32,5 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<a
|
||||
:href="editPath"
|
||||
class="btn btn-default js-edit-blob"
|
||||
@click="handleEditClick"
|
||||
>
|
||||
Edit
|
||||
</a>
|
||||
<a :href="editPath" class="btn btn-default js-edit-blob" @click="handleEditClick"> Edit </a>
|
||||
</template>
|
||||
|
|
|
@ -10,16 +10,9 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<span
|
||||
v-once
|
||||
class="file-row-stats"
|
||||
>
|
||||
<span class="cgreen">
|
||||
+{{ file.addedLines }}
|
||||
</span>
|
||||
<span class="cred">
|
||||
-{{ file.removedLines }}
|
||||
</span>
|
||||
<span v-once class="file-row-stats">
|
||||
<span class="cgreen"> +{{ file.addedLines }} </span>
|
||||
<span class="cred"> -{{ file.removedLines }} </span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue