Commit 4ad8c999 authored by Filipa Lacerda's avatar Filipa Lacerda

Merge branch 'master' into 37860-pipelines-page

* master: (88 commits)
  Fix deletion of container registry or images returning an error
  The fog-aliyun gem had a bug in v0.1.0 for file storage creation/update. This merge requests update the gem to v0.2.0 which contains the fix:
  Decrease ABC threshold to 54.28
  Update VERSION to 10.2.0-pre
  Update CHANGELOG.md for 10.1.0
  Document `CI_SHARED_ENVIRONMENT` and `CI_DISPOSABLE_ENVIRONMENT`
  Fix the external URLs generated for online view of HTML artifacts
  Use title as placeholder instead of issue title for reusability
  Fix failure in current_settings_spec.rb
  Clarify the difference between project_update and project_rename
  URI decode Page-Title header to preserve UTF-8 characters
  Update Gitaly version to v0.49.0
  Decrease Perceived Complexity threshold to 14
  Resolve "Remove help text regarding group issues on group issues page (and group merge requests page)"
  Force non diff resolved discussion to display when collapse toggled
  Added submodule support in multi-file editor
  add note about after_script being run separately
  Check for element before evaluate_script
  Merge branch 'master-i18n' into 'master'
  Update Prometheus gem to fix problems with other files overwriting current file
  ...
parents dfa79ebf c1ed00e8
...@@ -49,11 +49,11 @@ stages: ...@@ -49,11 +49,11 @@ stages:
- gitlab-org - gitlab-org
.tests-metadata-state: &tests-metadata-state .tests-metadata-state: &tests-metadata-state
services: [] <<: *dedicated-runner
variables: variables:
SETUP_DB: "false"
USE_BUNDLE_INSTALL: "false"
TESTS_METADATA_S3_BUCKET: "gitlab-ce-cache" TESTS_METADATA_S3_BUCKET: "gitlab-ce-cache"
before_script:
- source scripts/utils.sh
artifacts: artifacts:
expire_in: 31d expire_in: 31d
paths: paths:
...@@ -80,6 +80,7 @@ stages: ...@@ -80,6 +80,7 @@ stages:
.rspec-metadata: &rspec-metadata .rspec-metadata: &rspec-metadata
<<: *dedicated-runner <<: *dedicated-runner
<<: *pull-cache <<: *pull-cache
<<: *except-docs
stage: test stage: test
script: script:
- JOB_NAME=( $CI_JOB_NAME ) - JOB_NAME=( $CI_JOB_NAME )
...@@ -109,16 +110,15 @@ stages: ...@@ -109,16 +110,15 @@ stages:
.rspec-metadata-pg: &rspec-metadata-pg .rspec-metadata-pg: &rspec-metadata-pg
<<: *rspec-metadata <<: *rspec-metadata
<<: *use-pg <<: *use-pg
<<: *except-docs
.rspec-metadata-mysql: &rspec-metadata-mysql .rspec-metadata-mysql: &rspec-metadata-mysql
<<: *rspec-metadata <<: *rspec-metadata
<<: *use-mysql <<: *use-mysql
<<: *except-docs
.spinach-metadata: &spinach-metadata .spinach-metadata: &spinach-metadata
<<: *dedicated-runner <<: *dedicated-runner
<<: *pull-cache <<: *pull-cache
<<: *except-docs
stage: test stage: test
script: script:
- JOB_NAME=( $CI_JOB_NAME ) - JOB_NAME=( $CI_JOB_NAME )
...@@ -141,12 +141,10 @@ stages: ...@@ -141,12 +141,10 @@ stages:
.spinach-metadata-pg: &spinach-metadata-pg .spinach-metadata-pg: &spinach-metadata-pg
<<: *spinach-metadata <<: *spinach-metadata
<<: *use-pg <<: *use-pg
<<: *except-docs
.spinach-metadata-mysql: &spinach-metadata-mysql .spinach-metadata-mysql: &spinach-metadata-mysql
<<: *spinach-metadata <<: *spinach-metadata
<<: *use-mysql <<: *use-mysql
<<: *except-docs
.only-canonical-masters: &only-canonical-masters .only-canonical-masters: &only-canonical-masters
only: only:
...@@ -157,12 +155,8 @@ stages: ...@@ -157,12 +155,8 @@ stages:
# Trigger a package build in omnibus-gitlab repository # Trigger a package build in omnibus-gitlab repository
build-package: build-package:
image: ruby:2.3-alpine image: ruby:2.4-alpine
before_script: [] before_script: []
services: []
variables:
SETUP_DB: "false"
USE_BUNDLE_INSTALL: "false"
stage: build stage: build
cache: {} cache: {}
when: manual when: manual
...@@ -183,13 +177,9 @@ build-package: ...@@ -183,13 +177,9 @@ build-package:
- apk add --update openssl - apk add --update openssl
- wget https://gitlab.com/gitlab-org/gitlab-ce/raw/master/scripts/trigger-build-docs - wget https://gitlab.com/gitlab-org/gitlab-ce/raw/master/scripts/trigger-build-docs
- chmod 755 trigger-build-docs - chmod 755 trigger-build-docs
services: []
cache: {} cache: {}
dependencies: [] dependencies: []
artifacts: {}
variables: variables:
SETUP_DB: "false"
USE_BUNDLE_INSTALL: "false"
GIT_STRATEGY: none GIT_STRATEGY: none
when: manual when: manual
only: only:
...@@ -222,7 +212,6 @@ review-docs-cleanup: ...@@ -222,7 +212,6 @@ review-docs-cleanup:
# Retrieve knapsack and rspec_flaky reports # Retrieve knapsack and rspec_flaky reports
retrieve-tests-metadata: retrieve-tests-metadata:
<<: *tests-metadata-state <<: *tests-metadata-state
<<: *dedicated-runner
<<: *except-docs <<: *except-docs
stage: prepare stage: prepare
cache: cache:
...@@ -240,7 +229,6 @@ retrieve-tests-metadata: ...@@ -240,7 +229,6 @@ retrieve-tests-metadata:
update-tests-metadata: update-tests-metadata:
<<: *tests-metadata-state <<: *tests-metadata-state
<<: *dedicated-runner
<<: *only-canonical-masters <<: *only-canonical-masters
stage: post-test stage: post-test
cache: cache:
...@@ -305,69 +293,69 @@ setup-test-env: ...@@ -305,69 +293,69 @@ setup-test-env:
- public/assets - public/assets
- tmp/tests - tmp/tests
rspec-pg 0 25: *rspec-metadata-pg rspec-pg 0 26: *rspec-metadata-pg
rspec-pg 1 25: *rspec-metadata-pg rspec-pg 1 26: *rspec-metadata-pg
rspec-pg 2 25: *rspec-metadata-pg rspec-pg 2 26: *rspec-metadata-pg
rspec-pg 3 25: *rspec-metadata-pg rspec-pg 3 26: *rspec-metadata-pg
rspec-pg 4 25: *rspec-metadata-pg rspec-pg 4 26: *rspec-metadata-pg
rspec-pg 5 25: *rspec-metadata-pg rspec-pg 5 26: *rspec-metadata-pg
rspec-pg 6 25: *rspec-metadata-pg rspec-pg 6 26: *rspec-metadata-pg
rspec-pg 7 25: *rspec-metadata-pg rspec-pg 7 26: *rspec-metadata-pg
rspec-pg 8 25: *rspec-metadata-pg rspec-pg 8 26: *rspec-metadata-pg
rspec-pg 9 25: *rspec-metadata-pg rspec-pg 9 26: *rspec-metadata-pg
rspec-pg 10 25: *rspec-metadata-pg rspec-pg 10 26: *rspec-metadata-pg
rspec-pg 11 25: *rspec-metadata-pg rspec-pg 11 26: *rspec-metadata-pg
rspec-pg 12 25: *rspec-metadata-pg rspec-pg 12 26: *rspec-metadata-pg
rspec-pg 13 25: *rspec-metadata-pg rspec-pg 13 26: *rspec-metadata-pg
rspec-pg 14 25: *rspec-metadata-pg rspec-pg 14 26: *rspec-metadata-pg
rspec-pg 15 25: *rspec-metadata-pg rspec-pg 15 26: *rspec-metadata-pg
rspec-pg 16 25: *rspec-metadata-pg rspec-pg 16 26: *rspec-metadata-pg
rspec-pg 17 25: *rspec-metadata-pg rspec-pg 17 26: *rspec-metadata-pg
rspec-pg 18 25: *rspec-metadata-pg rspec-pg 18 26: *rspec-metadata-pg
rspec-pg 19 25: *rspec-metadata-pg rspec-pg 19 26: *rspec-metadata-pg
rspec-pg 20 25: *rspec-metadata-pg rspec-pg 20 26: *rspec-metadata-pg
rspec-pg 21 25: *rspec-metadata-pg rspec-pg 21 26: *rspec-metadata-pg
rspec-pg 22 25: *rspec-metadata-pg rspec-pg 22 26: *rspec-metadata-pg
rspec-pg 23 25: *rspec-metadata-pg rspec-pg 23 26: *rspec-metadata-pg
rspec-pg 24 25: *rspec-metadata-pg rspec-pg 24 26: *rspec-metadata-pg
rspec-pg 25 26: *rspec-metadata-pg
rspec-mysql 0 25: *rspec-metadata-mysql
rspec-mysql 1 25: *rspec-metadata-mysql rspec-mysql 0 26: *rspec-metadata-mysql
rspec-mysql 2 25: *rspec-metadata-mysql rspec-mysql 1 26: *rspec-metadata-mysql
rspec-mysql 3 25: *rspec-metadata-mysql rspec-mysql 2 26: *rspec-metadata-mysql
rspec-mysql 4 25: *rspec-metadata-mysql rspec-mysql 3 26: *rspec-metadata-mysql
rspec-mysql 5 25: *rspec-metadata-mysql rspec-mysql 4 26: *rspec-metadata-mysql
rspec-mysql 6 25: *rspec-metadata-mysql rspec-mysql 5 26: *rspec-metadata-mysql
rspec-mysql 7 25: *rspec-metadata-mysql rspec-mysql 6 26: *rspec-metadata-mysql
rspec-mysql 8 25: *rspec-metadata-mysql rspec-mysql 7 26: *rspec-metadata-mysql
rspec-mysql 9 25: *rspec-metadata-mysql rspec-mysql 8 26: *rspec-metadata-mysql
rspec-mysql 10 25: *rspec-metadata-mysql rspec-mysql 9 26: *rspec-metadata-mysql
rspec-mysql 11 25: *rspec-metadata-mysql rspec-mysql 10 26: *rspec-metadata-mysql
rspec-mysql 12 25: *rspec-metadata-mysql rspec-mysql 11 26: *rspec-metadata-mysql
rspec-mysql 13 25: *rspec-metadata-mysql rspec-mysql 12 26: *rspec-metadata-mysql
rspec-mysql 14 25: *rspec-metadata-mysql rspec-mysql 13 26: *rspec-metadata-mysql
rspec-mysql 15 25: *rspec-metadata-mysql rspec-mysql 14 26: *rspec-metadata-mysql
rspec-mysql 16 25: *rspec-metadata-mysql rspec-mysql 15 26: *rspec-metadata-mysql
rspec-mysql 17 25: *rspec-metadata-mysql rspec-mysql 16 26: *rspec-metadata-mysql
rspec-mysql 18 25: *rspec-metadata-mysql rspec-mysql 17 26: *rspec-metadata-mysql
rspec-mysql 19 25: *rspec-metadata-mysql rspec-mysql 18 26: *rspec-metadata-mysql
rspec-mysql 20 25: *rspec-metadata-mysql rspec-mysql 19 26: *rspec-metadata-mysql
rspec-mysql 21 25: *rspec-metadata-mysql rspec-mysql 20 26: *rspec-metadata-mysql
rspec-mysql 22 25: *rspec-metadata-mysql rspec-mysql 21 26: *rspec-metadata-mysql
rspec-mysql 23 25: *rspec-metadata-mysql rspec-mysql 22 26: *rspec-metadata-mysql
rspec-mysql 24 25: *rspec-metadata-mysql rspec-mysql 23 26: *rspec-metadata-mysql
rspec-mysql 24 26: *rspec-metadata-mysql
spinach-pg 0 5: *spinach-metadata-pg rspec-mysql 25 26: *rspec-metadata-mysql
spinach-pg 1 5: *spinach-metadata-pg
spinach-pg 2 5: *spinach-metadata-pg spinach-pg 0 4: *spinach-metadata-pg
spinach-pg 3 5: *spinach-metadata-pg spinach-pg 1 4: *spinach-metadata-pg
spinach-pg 4 5: *spinach-metadata-pg spinach-pg 2 4: *spinach-metadata-pg
spinach-pg 3 4: *spinach-metadata-pg
spinach-mysql 0 5: *spinach-metadata-mysql
spinach-mysql 1 5: *spinach-metadata-mysql spinach-mysql 0 4: *spinach-metadata-mysql
spinach-mysql 2 5: *spinach-metadata-mysql spinach-mysql 1 4: *spinach-metadata-mysql
spinach-mysql 3 5: *spinach-metadata-mysql spinach-mysql 2 4: *spinach-metadata-mysql
spinach-mysql 4 5: *spinach-metadata-mysql spinach-mysql 3 4: *spinach-metadata-mysql
# Static analysis jobs # Static analysis jobs
.ruby-static-analysis: &ruby-static-analysis .ruby-static-analysis: &ruby-static-analysis
......
...@@ -624,7 +624,7 @@ Style/PredicateName: ...@@ -624,7 +624,7 @@ Style/PredicateName:
# branches, and conditions. # branches, and conditions.
Metrics/AbcSize: Metrics/AbcSize:
Enabled: true Enabled: true
Max: 55.25 Max: 54.28
# This cop checks if the length of a block exceeds some maximum value. # This cop checks if the length of a block exceeds some maximum value.
Metrics/BlockLength: Metrics/BlockLength:
...@@ -665,7 +665,7 @@ Metrics/ParameterLists: ...@@ -665,7 +665,7 @@ Metrics/ParameterLists:
# A complexity metric geared towards measuring complexity for a human reader. # A complexity metric geared towards measuring complexity for a human reader.
Metrics/PerceivedComplexity: Metrics/PerceivedComplexity:
Enabled: true Enabled: true
Max: 15 Max: 14
# Lint ######################################################################## # Lint ########################################################################
......
This diff is collapsed.
0.48.0 0.49.0
\ No newline at end of file
...@@ -102,7 +102,7 @@ gem 'fog-google', '~> 0.5' ...@@ -102,7 +102,7 @@ gem 'fog-google', '~> 0.5'
gem 'fog-local', '~> 0.3' gem 'fog-local', '~> 0.3'
gem 'fog-openstack', '~> 0.1' gem 'fog-openstack', '~> 0.1'
gem 'fog-rackspace', '~> 0.1.1' gem 'fog-rackspace', '~> 0.1.1'
gem 'fog-aliyun', '~> 0.1.0' gem 'fog-aliyun', '~> 0.2.0'
# for Google storage # for Google storage
gem 'google-api-client', '~> 0.13.6' gem 'google-api-client', '~> 0.13.6'
...@@ -281,7 +281,7 @@ group :metrics do ...@@ -281,7 +281,7 @@ group :metrics do
gem 'influxdb', '~> 0.2', require: false gem 'influxdb', '~> 0.2', require: false
# Prometheus # Prometheus
gem 'prometheus-client-mmap', '~>0.7.0.beta14' gem 'prometheus-client-mmap', '~>0.7.0.beta17'
gem 'raindrops', '~> 0.18' gem 'raindrops', '~> 0.18'
end end
......
...@@ -214,7 +214,7 @@ GEM ...@@ -214,7 +214,7 @@ GEM
flowdock (0.7.1) flowdock (0.7.1)
httparty (~> 0.7) httparty (~> 0.7)
multi_json multi_json
fog-aliyun (0.1.0) fog-aliyun (0.2.0)
fog-core (~> 1.27) fog-core (~> 1.27)
fog-json (~> 1.0) fog-json (~> 1.0)
ipaddress (~> 0.8) ipaddress (~> 0.8)
...@@ -623,7 +623,7 @@ GEM ...@@ -623,7 +623,7 @@ GEM
parser parser
unparser unparser
procto (0.0.3) procto (0.0.3)
prometheus-client-mmap (0.7.0.beta14) prometheus-client-mmap (0.7.0.beta17)
mmap2 (~> 2.2, >= 2.2.7) mmap2 (~> 2.2, >= 2.2.7)
pry (0.10.4) pry (0.10.4)
coderay (~> 1.1.0) coderay (~> 1.1.0)
...@@ -1015,7 +1015,7 @@ DEPENDENCIES ...@@ -1015,7 +1015,7 @@ DEPENDENCIES
flay (~> 2.8.0) flay (~> 2.8.0)
flipper (~> 0.10.2) flipper (~> 0.10.2)
flipper-active_record (~> 0.10.2) flipper-active_record (~> 0.10.2)
fog-aliyun (~> 0.1.0) fog-aliyun (~> 0.2.0)
fog-aws (~> 1.4) fog-aws (~> 1.4)
fog-core (~> 1.44) fog-core (~> 1.44)
fog-google (~> 0.5) fog-google (~> 0.5)
...@@ -1106,7 +1106,7 @@ DEPENDENCIES ...@@ -1106,7 +1106,7 @@ DEPENDENCIES
pg (~> 0.18.2) pg (~> 0.18.2)
poltergeist (~> 1.9.0) poltergeist (~> 1.9.0)
premailer-rails (~> 1.9.7) premailer-rails (~> 1.9.7)
prometheus-client-mmap (~> 0.7.0.beta14) prometheus-client-mmap (~> 0.7.0.beta17)
pry-byebug (~> 3.4.1) pry-byebug (~> 3.4.1)
pry-rails (~> 0.3.4) pry-rails (~> 0.3.4)
rack-attack (~> 4.4.1) rack-attack (~> 4.4.1)
......
# GitLab Maintenance Policy # GitLab Maintenance Policy
GitLab follows the [Semantic Versioning](http://semver.org/) for its releases: See [doc/policy/maintenance.md](doc/policy/maintenance.md)
`(Major).(Minor).(Patch)` in a [pragmatic way].
- **Major version**: Whenever there is something significant or any backwards
incompatible changes are introduced to the public API.
- **Minor version**: When new, backwards compatible functionality is introduced
to the public API or a minor feature is introduced, or when a set of smaller
features is rolled out.
- **Patch number**: When backwards compatible bug fixes are introduced that fix
incorrect behavior.
The current stable release will receive security patches and bug fixes
(eg. `8.9.0` -> `8.9.1`). Feature releases will mark the next supported stable
release where the minor version is increased numerically by increments of one
(eg. `8.9 -> 8.10`).
Our current policy is to support one stable release at any given time, but for
medium-level security issues, we may consider [backporting to the previous two
monthly releases][rel-sec].
We encourage everyone to run the latest stable release to ensure that you can
easily upgrade to the most secure and feature-rich GitLab experience. In order
to make sure you can easily run the most recent stable release, we are working
hard to keep the update process simple and reliable.
More information about the release procedures can be found in our
[release-tools documentation][rel]. You may also want to read our
[Responsible Disclosure Policy][disclosure].
[rel-sec]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/security.md#backporting
[rel]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/
[disclosure]: https://about.gitlab.com/disclosure/
[pragmatic way]: https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e
10.1.0-pre 10.2.0-pre
/* eslint-disable func-names, object-shorthand, prefer-arrow-callback */ /* eslint-disable func-names, object-shorthand, prefer-arrow-callback */
/* global Dropzone */ import Dropzone from 'dropzone';
import '../lib/utils/url_utility'; import '../lib/utils/url_utility';
import { HIDDEN_CLASS } from '../lib/utils/constants'; import { HIDDEN_CLASS } from '../lib/utils/constants';
import csrf from '../lib/utils/csrf'; import csrf from '../lib/utils/csrf';
......
/* eslint-disable class-methods-use-this */
import './lib/utils/url_utility'; import './lib/utils/url_utility';
import FilesCommentButton from './files_comment_button'; import FilesCommentButton from './files_comment_button';
import SingleFileDiff from './single_file_diff'; import SingleFileDiff from './single_file_diff';
...@@ -8,7 +6,7 @@ import imageDiffHelper from './image_diff/helpers/index'; ...@@ -8,7 +6,7 @@ import imageDiffHelper from './image_diff/helpers/index';
const UNFOLD_COUNT = 20; const UNFOLD_COUNT = 20;
let isBound = false; let isBound = false;
class Diff { export default class Diff {
constructor() { constructor() {
const $diffFile = $('.files .diff-file'); const $diffFile = $('.files .diff-file');
...@@ -104,7 +102,7 @@ class Diff { ...@@ -104,7 +102,7 @@ class Diff {
} }
this.highlightSelectedLine(); this.highlightSelectedLine();
} }
// eslint-disable-next-line class-methods-use-this
handleParallelLineDown(e) { handleParallelLineDown(e) {
const line = $(e.currentTarget); const line = $(e.currentTarget);
const table = line.closest('table'); const table = line.closest('table');
...@@ -116,11 +114,11 @@ class Diff { ...@@ -116,11 +114,11 @@ class Diff {
table.addClass(`${lineClass}-selected`); table.addClass(`${lineClass}-selected`);
} }
} }
// eslint-disable-next-line class-methods-use-this
diffViewType() { diffViewType() {
return $('.inline-parallel-buttons a.active').data('view-type'); return $('.inline-parallel-buttons a.active').data('view-type');
} }
// eslint-disable-next-line class-methods-use-this
lineNumbers(line) { lineNumbers(line) {
const children = line.find('.diff-line-num').toArray(); const children = line.find('.diff-line-num').toArray();
if (children.length !== 2) { if (children.length !== 2) {
...@@ -128,7 +126,7 @@ class Diff { ...@@ -128,7 +126,7 @@ class Diff {
} }
return children.map(elm => parseInt($(elm).data('linenumber'), 10) || 0); return children.map(elm => parseInt($(elm).data('linenumber'), 10) || 0);
} }
// eslint-disable-next-line class-methods-use-this
highlightSelectedLine() { highlightSelectedLine() {
const hash = gl.utils.getLocationHash(); const hash = gl.utils.getLocationHash();
const $diffFiles = $('.diff-file'); const $diffFiles = $('.diff-file');
...@@ -141,6 +139,3 @@ class Diff { ...@@ -141,6 +139,3 @@ class Diff {
} }
} }
} }
window.gl = window.gl || {};
window.gl.Diff = Diff;
...@@ -87,6 +87,7 @@ import U2FAuthenticate from './u2f/authenticate'; ...@@ -87,6 +87,7 @@ import U2FAuthenticate from './u2f/authenticate';
import Members from './members'; import Members from './members';
import memberExpirationDate from './member_expiration_date'; import memberExpirationDate from './member_expiration_date';
import DueDateSelectors from './due_date_select'; import DueDateSelectors from './due_date_select';
import Diff from './diff';
(function() { (function() {
var Dispatcher; var Dispatcher;
...@@ -237,7 +238,7 @@ import DueDateSelectors from './due_date_select'; ...@@ -237,7 +238,7 @@ import DueDateSelectors from './due_date_select';
new GLForm($('.milestone-form'), true); new GLForm($('.milestone-form'), true);
break; break;
case 'projects:compare:show': case 'projects:compare:show':
new gl.Diff(); new Diff();
initChangesDropdown(); initChangesDropdown();
break; break;
case 'projects:branches:new': case 'projects:branches:new':
...@@ -273,7 +274,7 @@ import DueDateSelectors from './due_date_select'; ...@@ -273,7 +274,7 @@ import DueDateSelectors from './due_date_select';
} }
case 'projects:merge_requests:creations:diffs': case 'projects:merge_requests:creations:diffs':
case 'projects:merge_requests:edit': case 'projects:merge_requests:edit':
new gl.Diff(); new Diff();
shortcut_handler = new ShortcutsNavigation(); shortcut_handler = new ShortcutsNavigation();
new GLForm($('.merge-request-form'), true); new GLForm($('.merge-request-form'), true);
new IssuableForm($('.merge-request-form')); new IssuableForm($('.merge-request-form'));
...@@ -307,7 +308,7 @@ import DueDateSelectors from './due_date_select'; ...@@ -307,7 +308,7 @@ import DueDateSelectors from './due_date_select';
new GLForm($('.release-form'), true); new GLForm($('.release-form'), true);
break; break;
case 'projects:merge_requests:show': case 'projects:merge_requests:show':
new gl.Diff(); new Diff();
shortcut_handler = new ShortcutsIssuable(true); shortcut_handler = new ShortcutsIssuable(true);
new ZenMode(); new ZenMode();
...@@ -323,7 +324,7 @@ import DueDateSelectors from './due_date_select'; ...@@ -323,7 +324,7 @@ import DueDateSelectors from './due_date_select';
new gl.Activities(); new gl.Activities();
break; break;
case 'projects:commit:show': case 'projects:commit:show':
new gl.Diff(); new Diff();
new ZenMode(); new ZenMode();
shortcut_handler = new ShortcutsNavigation(); shortcut_handler = new ShortcutsNavigation();
new MiniPipelineGraph({ new MiniPipelineGraph({
......
This diff is collapsed.
/* eslint-disable func-names, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, max-len, one-var, one-var-declaration-per-line, quotes, prefer-template, newline-per-chained-call, comma-dangle, new-cap, no-else-return, consistent-return */
/* global notes */
/* Developer beware! Do not add logic to showButton or hideButton /* Developer beware! Do not add logic to showButton or hideButton
* that will force a reflow. Doing so will create a signficant performance * that will force a reflow. Doing so will create a signficant performance
* bottleneck for pages with large diffs. For a comprehensive list of what * bottleneck for pages with large diffs. For a comprehensive list of what
...@@ -20,8 +17,10 @@ const DIFF_EXPANDED_CLASS = 'diff-expanded'; ...@@ -20,8 +17,10 @@ const DIFF_EXPANDED_CLASS = 'diff-expanded';
export default { export default {
init($diffFile) { init($diffFile) {
/* Caching is used only when the following members are *true*. This is because there are likely to be /* Caching is used only when the following members are *true*.
* differently configured versions of diffs in the same session. However if these values are true, they * This is because there are likely to be
* differently configured versions of diffs in the same session.
* However if these values are true, they
* will be true in all cases */ * will be true in all cases */
if (!this.userCanCreateNote) { if (!this.userCanCreateNote) {
......
/* global DropzoneInput */
/* global autosize */ /* global autosize */
import GfmAutoComplete from './gfm_auto_complete'; import GfmAutoComplete from './gfm_auto_complete';
import dropzoneInput from './dropzone_input';
export default class GLForm { export default class GLForm {
constructor(form, enableGFM = false) { constructor(form, enableGFM = false) {
...@@ -41,7 +41,7 @@ export default class GLForm { ...@@ -41,7 +41,7 @@ export default class GLForm {
mergeRequests: this.enableGFM, mergeRequests: this.enableGFM,
labels: this.enableGFM, labels: this.enableGFM,
}); });
new DropzoneInput(this.form); // eslint-disable-line no-new dropzoneInput(this.form);
autosize(this.textarea); autosize(this.textarea);
} }
// form and textarea event listeners // form and textarea event listeners
......
...@@ -16,15 +16,15 @@ ...@@ -16,15 +16,15 @@
<fieldset> <fieldset>
<label <label
class="sr-only" class="sr-only"
for="issue-title"> for="issuable-title">
Title Title
</label> </label>
<input <input
id="issue-title" id="issuable-title"
class="form-control" class="form-control"
type="text" type="text"
placeholder="Issue title" placeholder="Title"
aria-label="Issue title" aria-label="Title"
v-model="formState.title" v-model="formState.title"
@keydown.meta.enter="updateIssuable" @keydown.meta.enter="updateIssuable"
@keydown.ctrl.enter="updateIssuable" /> @keydown.ctrl.enter="updateIssuable" />
......
...@@ -50,8 +50,6 @@ import './compare_autocomplete'; ...@@ -50,8 +50,6 @@ import './compare_autocomplete';
import './confirm_danger_modal'; import './confirm_danger_modal';
import './copy_as_gfm'; import './copy_as_gfm';
import './copy_to_clipboard'; import './copy_to_clipboard';
import './diff';
import './files_comment_button';
import Flash, { removeFlashClickListener } from './flash'; import Flash, { removeFlashClickListener } from './flash';
import './gl_dropdown'; import './gl_dropdown';
import './gl_field_error'; import './gl_field_error';
......
...@@ -11,8 +11,8 @@ import { ...@@ -11,8 +11,8 @@ import {
handleLocationHash, handleLocationHash,
isMetaClick, isMetaClick,
} from './lib/utils/common_utils'; } from './lib/utils/common_utils';
import initDiscussionTab from './image_diff/init_discussion_tab'; import initDiscussionTab from './image_diff/init_discussion_tab';
import Diff from './diff';
/* eslint-disable max-len */ /* eslint-disable max-len */
// MergeRequestTabs // MergeRequestTabs
...@@ -292,7 +292,7 @@ import initDiscussionTab from './image_diff/init_discussion_tab'; ...@@ -292,7 +292,7 @@ import initDiscussionTab from './image_diff/init_discussion_tab';
} }
this.diffsLoaded = true; this.diffsLoaded = true;
new gl.Diff(); new Diff();
this.scrollToElement('#diffs'); this.scrollToElement('#diffs');
$('.diff-file').each((i, el) => { $('.diff-file').each((i, el) => {
......
...@@ -13,7 +13,6 @@ import $ from 'jquery'; ...@@ -13,7 +13,6 @@ import $ from 'jquery';
import _ from 'underscore'; import _ from 'underscore';
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import autosize from 'vendor/autosize'; import autosize from 'vendor/autosize';
import Dropzone from 'dropzone';
import 'vendor/jquery.caret'; // required by jquery.atwho import 'vendor/jquery.caret'; // required by jquery.atwho
import 'vendor/jquery.atwho'; import 'vendor/jquery.atwho';
import AjaxCache from '~/lib/utils/ajax_cache'; import AjaxCache from '~/lib/utils/ajax_cache';
...@@ -22,13 +21,11 @@ import CommentTypeToggle from './comment_type_toggle'; ...@@ -22,13 +21,11 @@ import CommentTypeToggle from './comment_type_toggle';
import GLForm from './gl_form'; import GLForm from './gl_form';
import loadAwardsHandler from './awards_handler'; import loadAwardsHandler from './awards_handler';
import './autosave'; import './autosave';
import './dropzone_input';
import TaskList from './task_list'; import TaskList from './task_list';
import { ajaxPost, isInViewport, getPagePath, scrollToElement, isMetaKey } from './lib/utils/common_utils'; import { ajaxPost, isInViewport, getPagePath, scrollToElement, isMetaKey } from './lib/utils/common_utils';
import imageDiffHelper from './image_diff/helpers/index'; import imageDiffHelper from './image_diff/helpers/index';
window.autosize = autosize; window.autosize = autosize;
window.Dropzone = Dropzone;
function normalizeNewlines(str) { function normalizeNewlines(str) {
return str.replace(/\r\n/g, '\n'); return str.replace(/\r\n/g, '\n');
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
}, },
showError(message) { showError(message) {
Flash((errorMessages[message])); Flash(errorMessages[message]);
}, },
}, },
}; };
......
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
}, },
showError(message) { showError(message) {
Flash((errorMessages[message])); Flash(errorMessages[message]);
}, },
}, },
}; };
......
...@@ -29,11 +29,9 @@ export const fetchList = ({ commit }, { repo, page }) => { ...@@ -29,11 +29,9 @@ export const fetchList = ({ commit }, { repo, page }) => {
}); });
}; };
export const deleteRepo = ({ commit }, repo) => Vue.http.delete(repo.destroyPath) export const deleteRepo = ({ commit }, repo) => Vue.http.delete(repo.destroyPath);
.then(res => res.json());
export const deleteRegistry = ({ commit }, image) => Vue.http.delete(image.destroyPath) export const deleteRegistry = ({ commit }, image) => Vue.http.delete(image.destroyPath);
.then(res => res.json());
export const setMainEndpoint = ({ commit }, data) => commit(types.SET_MAIN_ENDPOINT, data); export const setMainEndpoint = ({ commit }, data) => commit(types.SET_MAIN_ENDPOINT, data);
export const toggleLoading = ({ commit }) => commit(types.TOGGLE_MAIN_LOADING); export const toggleLoading = ({ commit }) => commit(types.TOGGLE_MAIN_LOADING);
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
marginLeft: `${this.file.level * 16}px`, marginLeft: `${this.file.level * 16}px`,
}; };
}, },
shortId() {
return this.file.id.substr(0, 8);
},
}, },
methods: { methods: {
linkClicked(file) { linkClicked(file) {
...@@ -55,6 +58,17 @@ ...@@ -55,6 +58,17 @@
> >
{{ file.name }} {{ file.name }}
</a> </a>
<template v-if="file.type === 'submodule' && file.id">
@
<span class="commit-sha">
<a
@click.stop
:href="file.tree_url"
>
{{ shortId }}
</a>
</span>
</template>
</td> </td>
<template v-if="!isMini"> <template v-if="!isMini">
...@@ -69,7 +83,10 @@ ...@@ -69,7 +83,10 @@
</td> </td>
<td class="commit-update hidden-xs text-right"> <td class="commit-update hidden-xs text-right">
<span :title="tooltipTitle(file.lastCommit.updatedAt)"> <span
v-if="file.lastCommit.updatedAt"
:title="tooltipTitle(file.lastCommit.updatedAt)"
>
{{ timeFormated(file.lastCommit.updatedAt) }} {{ timeFormated(file.lastCommit.updatedAt) }}
</span> </span>
</td> </td>
......
...@@ -74,6 +74,10 @@ export default { ...@@ -74,6 +74,10 @@ export default {
if (file.type === 'tree' && file.opened) { if (file.type === 'tree' && file.opened) {
Helper.setDirectoryToClosed(file); Helper.setDirectoryToClosed(file);
Store.setActiveLine(lineNumber); Store.setActiveLine(lineNumber);
} else if (file.type === 'submodule') {
file.loading = true;
gl.utils.visitUrl(file.url);
} else { } else {
const openFile = Helper.getFileFromPath(file.url); const openFile = Helper.getFileFromPath(file.url);
......
...@@ -95,7 +95,7 @@ const RepoHelper = { ...@@ -95,7 +95,7 @@ const RepoHelper = {
return Service.getContent() return Service.getContent()
.then((response) => { .then((response) => {
const data = response.data; const data = response.data;
if (response.headers && response.headers['page-title']) data.pageTitle = response.headers['page-title']; if (response.headers && response.headers['page-title']) data.pageTitle = decodeURI(response.headers['page-title']);
if (response.headers && response.headers['is-root'] && !Store.isInitialRoot) { if (response.headers && response.headers['is-root'] && !Store.isInitialRoot) {
Store.isRoot = convertPermissionToBoolean(response.headers['is-root']); Store.isRoot = convertPermissionToBoolean(response.headers['is-root']);
Store.isInitialRoot = Store.isRoot; Store.isInitialRoot = Store.isRoot;
...@@ -157,12 +157,14 @@ const RepoHelper = { ...@@ -157,12 +157,14 @@ const RepoHelper = {
}, },
serializeRepoEntity(type, entity, level = 0) { serializeRepoEntity(type, entity, level = 0) {
const { url, name, icon, last_commit } = entity; const { id, url, name, icon, last_commit, tree_url } = entity;
return { return {
id,
type, type,
name, name,
url, url,
tree_url,
level, level,
icon: `fa-${icon}`, icon: `fa-${icon}`,
files: [], files: [],
......
...@@ -11,8 +11,6 @@ import Dropzone from 'dropzone'; ...@@ -11,8 +11,6 @@ import Dropzone from 'dropzone';
import 'mousetrap'; import 'mousetrap';
import 'mousetrap/plugins/pause/mousetrap-pause'; import 'mousetrap/plugins/pause/mousetrap-pause';
window.Dropzone = Dropzone;
// //
// ### Events // ### Events
// //
......
...@@ -23,6 +23,11 @@ ...@@ -23,6 +23,11 @@
@include webkit-prefix(animation-duration, 2s); @include webkit-prefix(animation-duration, 2s);
} }
&.spin {
transform-origin: center;
animation: spin 4s linear infinite;
}
&.flipOutX, &.flipOutX,
&.flipOutY, &.flipOutY,
&.bounceIn, &.bounceIn,
...@@ -271,3 +276,9 @@ a { ...@@ -271,3 +276,9 @@ a {
transform: translateX(468px); transform: translateX(468px);
} }
} }
@keyframes spin {
100% {
transform: rotate(360deg);
}
}
...@@ -6,7 +6,7 @@ $active-background: rgba(0, 0, 0, .04); ...@@ -6,7 +6,7 @@ $active-background: rgba(0, 0, 0, .04);
$active-hover-background: $active-background; $active-hover-background: $active-background;
$active-hover-color: $gl-text-color; $active-hover-color: $gl-text-color;
$inactive-badge-background: rgba(0, 0, 0, .08); $inactive-badge-background: rgba(0, 0, 0, .08);
$hover-background: $white-light; $hover-background: rgba(0, 0, 0, .06);
$hover-color: $gl-text-color; $hover-color: $gl-text-color;
$inactive-color: $gl-text-color-secondary; $inactive-color: $gl-text-color-secondary;
$new-sidebar-width: 220px; $new-sidebar-width: 220px;
...@@ -330,7 +330,7 @@ $new-sidebar-collapsed-width: 50px; ...@@ -330,7 +330,7 @@ $new-sidebar-collapsed-width: 50px;
&.active > a:hover, &.active > a:hover,
&.is-over > a { &.is-over > a {
background-color: $white-light; background-color: $hover-background;
} }
} }
} }
...@@ -344,7 +344,7 @@ $new-sidebar-collapsed-width: 50px; ...@@ -344,7 +344,7 @@ $new-sidebar-collapsed-width: 50px;
position: fixed; position: fixed;
bottom: 0; bottom: 0;
padding: 16px; padding: 16px;
background-color: $gray-normal; background-color: $gray-light;
border: 0; border: 0;
border-top: 2px solid $border-color; border-top: 2px solid $border-color;
color: $gl-text-color-secondary; color: $gl-text-color-secondary;
......
...@@ -61,6 +61,11 @@ ...@@ -61,6 +61,11 @@
border: 1px solid $dropdown-border-color; border: 1px solid $dropdown-border-color;
min-width: 175px; min-width: 175px;
color: $gl-text-color; color: $gl-text-color;
z-index: 999;
}
.select2-drop-mask {
z-index: 998;
} }
.select2-drop.select2-drop-above.select2-drop-active { .select2-drop.select2-drop-above.select2-drop-active {
......
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
border-radius: $border-radius-default; border-radius: $border-radius-default;
line-height: 16px; line-height: 16px;
font-weight: $gl-font-weight-normal; font-weight: $gl-font-weight-normal;
padding: $gl-btn-padding; padding: 8px;
} }
...@@ -349,6 +349,6 @@ class ApplicationController < ActionController::Base ...@@ -349,6 +349,6 @@ class ApplicationController < ActionController::Base
def set_page_title_header def set_page_title_header
# Per https://tools.ietf.org/html/rfc5987, headers need to be ISO-8859-1, not UTF-8 # Per https://tools.ietf.org/html/rfc5987, headers need to be ISO-8859-1, not UTF-8
response.headers['Page-Title'] = page_title('GitLab').encode('ISO-8859-1') response.headers['Page-Title'] = URI.escape(page_title('GitLab'))
end end
end end
...@@ -141,6 +141,17 @@ class GroupsController < Groups::ApplicationController ...@@ -141,6 +141,17 @@ class GroupsController < Groups::ApplicationController
end end
def load_events def load_events
params[:sort] ||= 'latest_activity_desc'
options = {}
options[:only_owned] = true if params[:shared] == '0'
options[:only_shared] = true if params[:shared] == '1'
@projects = GroupProjectsFinder.new(params: params, group: group, options: options, current_user: current_user)
.execute
.includes(:namespace)
.page(params[:page])
@events = EventCollection @events = EventCollection
.new(@projects, offset: params[:offset].to_i, filter: event_filter) .new(@projects, offset: params[:offset].to_i, filter: event_filter)
.to_a .to_a
......
...@@ -48,6 +48,8 @@ class Projects::CommitsController < Projects::ApplicationController ...@@ -48,6 +48,8 @@ class Projects::CommitsController < Projects::ApplicationController
private private
def set_commits def set_commits
render_404 unless request.format == :atom || @repository.blob_at(@commit.id, @path) || @repository.tree(@commit.id, @path).entries.present?
@limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i @limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i
search = params[:search] search = params[:search]
......
...@@ -15,7 +15,7 @@ module ProjectsHelper ...@@ -15,7 +15,7 @@ module ProjectsHelper
end end
def link_to_member_avatar(author, opts = {}) def link_to_member_avatar(author, opts = {})
default_opts = { size: 16 } default_opts = { size: 16, lazy_load: false }
opts = default_opts.merge(opts) opts = default_opts.merge(opts)
classes = %W[avatar avatar-inline s#{opts[:size]}] classes = %W[avatar avatar-inline s#{opts[:size]}]
...@@ -27,8 +27,26 @@ module ProjectsHelper ...@@ -27,8 +27,26 @@ module ProjectsHelper
image_tag(src, width: opts[:size], class: classes, alt: '', "data-src" => avatar) image_tag(src, width: opts[:size], class: classes, alt: '', "data-src" => avatar)
end end
def author_content_tag(author, opts = {})
default_opts = { author_class: 'author', tooltip: false, by_username: false }
opts = default_opts.merge(opts)
has_tooltip = !opts[:by_username] && opts[:tooltip]
username = opts[:by_username] ? author.to_reference : author.name
name_tag_options = { class: [opts[:author_class]] }
if has_tooltip
name_tag_options[:title] = author.to_reference
name_tag_options[:data] = { placement: 'top' }
name_tag_options[:class] << 'has-tooltip'
end
content_tag(:span, sanitize(username), name_tag_options)
end
def link_to_member(project, author, opts = {}, &block) def link_to_member(project, author, opts = {}, &block)
default_opts = { avatar: true, name: true, size: 16, author_class: 'author', title: ":name", tooltip: false, lazy_load: false } default_opts = { avatar: true, name: true, title: ":name" }
opts = default_opts.merge(opts) opts = default_opts.merge(opts)
return "(deleted)" unless author return "(deleted)" unless author
...@@ -39,12 +57,7 @@ module ProjectsHelper ...@@ -39,12 +57,7 @@ module ProjectsHelper
author_html << link_to_member_avatar(author, opts) if opts[:avatar] author_html << link_to_member_avatar(author, opts) if opts[:avatar]
# Build name span tag # Build name span tag
if opts[:by_username] author_html << author_content_tag(author, opts) if opts[:name]
author_html << content_tag(:span, sanitize("@#{author.username}"), class: opts[:author_class]) if opts[:name]
else
tooltip_data = { placement: 'top' }
author_html << content_tag(:span, sanitize(author.name), class: [opts[:author_class], ('has-tooltip' if opts[:tooltip])], title: (author.to_reference if opts[:tooltip]), data: (tooltip_data if opts[:tooltip])) if opts[:name]
end
author_html << capture(&block) if block author_html << capture(&block) if block
......
...@@ -203,7 +203,10 @@ class ApplicationSetting < ActiveRecord::Base ...@@ -203,7 +203,10 @@ class ApplicationSetting < ActiveRecord::Base
ensure_cache_setup ensure_cache_setup
Rails.cache.fetch(CACHE_KEY) do Rails.cache.fetch(CACHE_KEY) do
ApplicationSetting.last ApplicationSetting.last.tap do |settings|
# do not cache nils
raise 'missing settings' unless settings
end
end end
rescue rescue
# Fall back to an uncached value if there are any problems (e.g. redis down) # Fall back to an uncached value if there are any problems (e.g. redis down)
......
...@@ -2,7 +2,7 @@ module Ci ...@@ -2,7 +2,7 @@ module Ci
class ArtifactBlob class ArtifactBlob
include BlobLike include BlobLike
EXTENTIONS_SERVED_BY_PAGES = %w[.html .htm .txt .json].freeze EXTENSIONS_SERVED_BY_PAGES = %w[.html .htm .txt .json].freeze
attr_reader :entry attr_reader :entry
...@@ -36,17 +36,22 @@ module Ci ...@@ -36,17 +36,22 @@ module Ci
def external_url(project, job) def external_url(project, job)
return unless external_link?(job) return unless external_link?(job)
components = project.full_path_components full_path_parts = project.full_path_components
components << "-/jobs/#{job.id}/artifacts/file/#{path}" top_level_group = full_path_parts.shift
artifact_path = components[1..-1].join('/')
"#{pages_config.protocol}://#{components[0]}.#{pages_config.host}/#{artifact_path}" artifact_path = [
'-', *full_path_parts, '-',
'jobs', job.id,
'artifacts', path
].join('/')
"#{pages_config.protocol}://#{top_level_group}.#{pages_config.host}/#{artifact_path}"
end end
def external_link?(job) def external_link?(job)
pages_config.enabled && pages_config.enabled &&
pages_config.artifacts_server && pages_config.artifacts_server &&
EXTENTIONS_SERVED_BY_PAGES.include?(File.extname(name)) && EXTENSIONS_SERVED_BY_PAGES.include?(File.extname(name)) &&
job.project.public? job.project.public?
end end
......
...@@ -4,7 +4,7 @@ class ContainerTagEntity < Grape::Entity ...@@ -4,7 +4,7 @@ class ContainerTagEntity < Grape::Entity
expose :name, :location, :revision, :short_revision, :total_size, :created_at expose :name, :location, :revision, :short_revision, :total_size, :created_at
expose :destroy_path, if: -> (*) { can_destroy? } do |tag| expose :destroy_path, if: -> (*) { can_destroy? } do |tag|
project_registry_repository_tag_path(project, tag.repository, tag.name, format: :json) project_registry_repository_tag_path(project, tag.repository, tag.name)
end end
private private
......
...@@ -7,7 +7,7 @@ class SubmoduleEntity < Grape::Entity ...@@ -7,7 +7,7 @@ class SubmoduleEntity < Grape::Entity
'archive' 'archive'
end end
expose :project_url do |blob| expose :url do |blob|
submodule_links(blob, request).first submodule_links(blob, request).first
end end
......
...@@ -51,7 +51,7 @@ module Projects ...@@ -51,7 +51,7 @@ module Projects
end end
def wiki_path def wiki_path
repo_path + '.wiki' project.wiki.disk_path
end end
def trash_repositories! def trash_repositories!
......
...@@ -44,4 +44,4 @@ ...@@ -44,4 +44,4 @@
= render "discussions/diff_with_notes", discussion: discussion = render "discussions/diff_with_notes", discussion: discussion
- else - else
.panel.panel-default .panel.panel-default
= render "discussions/notes", discussion: discussion = render partial: "discussions/notes", locals: { discussion: discussion, disable_collapse_class: true }
...@@ -19,13 +19,6 @@ ...@@ -19,13 +19,6 @@
= render 'shared/issuable/search_bar', type: :issues = render 'shared/issuable/search_bar', type: :issues
.row-content-block.second-block
Only issues from the
%strong= @group.name
group are listed here.
- if current_user
To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page.
= render 'shared/issues' = render 'shared/issues'
- else - else
= render 'shared/empty_states/issues', project_select_button: true = render 'shared/empty_states/issues', project_select_button: true
...@@ -15,11 +15,4 @@ ...@@ -15,11 +15,4 @@
= render 'shared/issuable/search_bar', type: :merge_requests = render 'shared/issuable/search_bar', type: :merge_requests
.row-content-block.second-block
Only merge requests from
%strong= @group.name
group are listed here.
- if current_user
To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page.
= render 'shared/merge_requests' = render 'shared/merge_requests'
...@@ -272,6 +272,11 @@ ...@@ -272,6 +272,11 @@
= sprite_icon('users') = sprite_icon('users')
%span.nav-item-name %span.nav-item-name
Members Members
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(path: %w[members#show], html_options: { class: "fly-out-top-item" } ) do
= link_to project_settings_members_path(@project) do
%strong.fly-out-top-item-name
#{ _('Members') }
= render 'shared/sidebar_toggle_button' = render 'shared/sidebar_toggle_button'
......
This diff is collapsed.
---
title: Confirmation email shows link as text instead of human readable text
merge_request: 14243
author: bitsapien
type: changed
---
title: Allow to use same periods for different housekeeping tasks (effectively
skipping the lesser task)
merge_request: 13711
author: cernvcs
type: added
---
title: Upgrade gitlab-markup gem
merge_request: 14395
author: Markus Koller
type: other
---
title: "Add missing space in Sidekiq memory killer log message"
merge_request: 14553
author: Benjamin Drung
type: fixed
---
title: Escape quotes in git username
merge_request: 14020
author: Brandon Everett
type: fixed
title: Discussion lock for issues and merge requests
merge_request:
author:
type: added
---
title: Add an API endpoint to determine the forks of a project
merge_request:
author:
type: added
---
title: Return only group's members in user dropdowns on issuables list pages
merge_request: 14249
author:
type: changed
---
title: Make the labels in the Compare form less confusing
merge_request: 14225
author:
type: changed
---
title: Don't show an "Unsubscribe" link in snippet comment notifications
merge_request: 14764
author:
type: fixed
---
title: Extract AutocompleteController#users into finder
merge_request: 13778
author: Maxim Rydkin, Mayra Cabrera
type: other
---
title: Fix the default branches sorting to actually be 'Last updated'
merge_request: 14295
author:
type: fixed
--- ---
title: Move `lib/ci` to `lib/gitlab/ci` title: Decrease ABC threshold to 54.28
merge_request: 14078 merge_request: 14920
author: Maxim Rydkin author: Maxim Rydkin
type: other type: other
--- ---
title: Decrease Perceived Complexity threshold to 15 title: Decrease Perceived Complexity threshold to 14
merge_request: 14160 merge_request: 14231
author: Maxim Rydkin author: Maxim Rydkin
type: other type: other
---
title: Decrease Cyclomatic Complexity threshold to 13
merge_request: 14152
author: Maxim Rydkin
type: other
---
title: Added defaults for protected branches dropdowns on the repository settings
merge_request: 14278
author:
type: changed
---
title: Adds gitlab features and components to usage ping data.
merge_request: 14305
author:
type: other
---
title: Link SAML users to LDAP by email.
merge_request: 14216
author:
type: changed
---
title: Add online view of HTML artifacts for public projects
merge_request: 14399
author:
type: added
---
title: Fixes project denial of service via gitmodules using Extended ASCII.
merge_request: 14301
author:
type: fixed
---
title: Load sidebar participants avatars only when visible
merge_request: 14270
author:
type: other
---
title: Optimize the boards' issues fetching.
merge_request: 14198
author:
type: other
---
title: Improves i18n for Auto Devops callout
merge_request:
author:
type: other
---
title: made read-only APIs for public merge requests available without authentication
merge_request: 13291
author: haseebeqx
---
title: Fix the project import with issues and milestones
merge_request: 14657
author:
type: fixed
---
title: creation of keys moved to services
merge_request: 13331
author: haseebeqx
---
title: Re-arrange <script> tags before <template> tags in .vue files
merge_request: 14671
author:
type: changed
--- ---
title: fix merge request widget status icon for failed CI title: Decreases z-index of select2 to a lower number of our navigation bar
merge_request: merge_request:
author: author:
type: fixed type: fixed
---
title: Allow prometheus graphs to correctly handle NaN values
merge_request: 14741
author:
type: fixed
---
title: Allow the git circuit breaker to correctly handle missing repository storages
merge_request: 14417
author:
type: fixed
---
title: Reschedule merge request diff background migrations to catch failures from
9.5 run
merge_request:
author:
type: fixed
---
title: Remove the ability to visit the issue edit form directly
merge_request: 14523
author:
type: removed
---
title: Hide close MR button after merge without reloading page
merge_request: 14122
author: Jacopo Beschi @jacopo-beschi
type: added
---
title: Add support for GPG subkeys in signature verification
merge_request: 14517
author:
type: added
---
title: Add Gitaly version to Admin Dashboard
merge_request: 14313
author: Jacopo Beschi @jacopo-beschi
type: added
---
title: Add GitLab-Pages version to Admin Dashboard
merge_request: 14040
author: travismiller
type: added
---
title: Fixed non-UTF-8 valid branch names from causing an error.
merge_request: 14090
type: fixed
---
title: Fix incorrect X-axis labels in Prometheus graphs
merge_request: 14258
author:
type: fixed
---
title: Exports common_utils utility functions as modules
merge_request:
author:
type: other
---
title: Add active states to nav bar counters
merge_request:
author:
type: changed
---
title: 'Add help text to runner edit: tags should be separated by commas.'
merge_request:
author: Brendan O'Leary
type: added
---
title: Fix the number representing the amount of commits related to a push event
merge_request:
author:
type: fixed
---
title: 'Replace `tag: true` into `:tag` in the specs'
merge_request: 14653
author: Jacopo Beschi @jacopo-beschi
type: added
---
title: Fixed duplicate notifications when added multiple labels on an issue
merge_request: 14798
author:
type: fixed
---
title: Parse and store gitlab-runner timestamped section markers
merge_request: 14551
author:
type: added
---
title: Strip gitlab-runner section markers in build trace HTML view
merge_request: 14393
author:
type: added
---
title: Fix the filesystem shard health check to check all configured shards
merge_request: 14341
author:
type: fixed
---
title: Move the deployment flag content to the left when deployment marker is near
the end
merge_request: 14514
author:
type: fixed
---
title: Sync up hover and legend data across all graphs for the prometheus dashboard
merge_request:
author:
type: fixed
---
title: Use `simple=true` for projects API in Projects dropdown for better search performance
merge_request:
author:
type: other
---
title: Fix bottom spacing for dropdowns that open upwards
merge_request: 14535
author:
type: fixed
---
title: Fix `rake gitlab:incoming_email:check` and make it report the actual error
merge_request: 14423
author:
type: fixed
---
title: Does not check if an invariant hashed storage path exists on disk when renaming
projects.
merge_request: 14428
author:
type: fixed
---
title: Also reserve refs/replace after importing a project
merge_request: 14436
author:
type: fixed
---
title: Allow merge in MR widget with no pipeline but using "Only allow merge requests
to be merged if the pipeline succeeds"
merge_request: 14633
author:
type: fixed
---
title: Use explicit boolean true attribute for show-disabled-button in Vue files
merge_request: 14672
author:
type: fixed
---
title: Fix notes type created from import. This should fix some missing notes issues
from imported projects
merge_request: 14524
author:
type: fixed
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment