...@@ -345,6 +345,8 @@ RSpec/HaveGitlabHttpStatus: ...@@ -345,6 +345,8 @@ RSpec/HaveGitlabHttpStatus:
- 'ee/spec/controllers/**/*' - 'ee/spec/controllers/**/*'
- 'spec/requests/*.rb' - 'spec/requests/*.rb'
- 'ee/spec/requests/*.rb' - 'ee/spec/requests/*.rb'
- 'spec/requests/api/*/**/*.rb'
- 'ee/spec/requests/api/*/**/*.rb'
Style/MultilineWhenThen: Style/MultilineWhenThen:
Enabled: false Enabled: false
... ...
......
...@@ -19,7 +19,7 @@ import AccessorUtils from '~/lib/utils/accessor'; ...@@ -19,7 +19,7 @@ import AccessorUtils from '~/lib/utils/accessor';
import Icon from '~/vue_shared/components/icon.vue'; import Icon from '~/vue_shared/components/icon.vue';
import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue'; import TimeAgo from '~/vue_shared/components/time_ago_tooltip.vue';
import { __ } from '~/locale'; import { __ } from '~/locale';
import _ from 'underscore'; import { isEmpty } from 'lodash';
export const tableDataClass = 'table-col d-flex d-sm-table-cell align-items-center'; export const tableDataClass = 'table-col d-flex d-sm-table-cell align-items-center';
...@@ -139,7 +139,7 @@ export default { ...@@ -139,7 +139,7 @@ export default {
'cursor', 'cursor',
]), ]),
paginationRequired() { paginationRequired() {
return !_.isEmpty(this.pagination); return !isEmpty(this.pagination);
}, },
}, },
watch: { watch: {
... ...
......
<script> <script>
import _ from 'underscore'; import { escape as esc } from 'lodash';
import { GlTooltip } from '@gitlab/ui'; import { GlTooltip } from '@gitlab/ui';
import { __, sprintf } from '~/locale'; import { __, sprintf } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue'; import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
...@@ -62,7 +62,7 @@ export default { ...@@ -62,7 +62,7 @@ export default {
? sprintf( ? sprintf(
__(`%{spanStart}in%{spanEnd} %{errorFn}`), __(`%{spanStart}in%{spanEnd} %{errorFn}`),
{ {
errorFn: `<strong>${_.escape(this.errorFn)}</strong>`, errorFn: `<strong>${esc(this.errorFn)}</strong>`,
spanStart: `<span class="text-tertiary">`, spanStart: `<span class="text-tertiary">`,
spanEnd: `</span>`, spanEnd: `</span>`,
}, },
... ...
......
import $ from 'jquery'; import $ from 'jquery';
import _ from 'underscore'; import { debounce } from 'lodash';
import { __ } from '~/locale'; import { __ } from '~/locale';
import Flash from '~/flash'; import Flash from '~/flash';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
...@@ -62,7 +62,7 @@ export default class MirrorRepos { ...@@ -62,7 +62,7 @@ export default class MirrorRepos {
} }
registerUpdateListeners() { registerUpdateListeners() {
this.debouncedUpdateUrl = _.debounce(() => this.updateUrl(), 200); this.debouncedUpdateUrl = debounce(() => this.updateUrl(), 200);
this.$urlInput.on('input', () => this.debouncedUpdateUrl()); this.$urlInput.on('input', () => this.debouncedUpdateUrl());
this.$protectedBranchesInput.on('change', () => this.updateProtectedBranches()); this.$protectedBranchesInput.on('change', () => this.updateProtectedBranches());
this.$table.on('click', '.js-delete-mirror', event => this.deleteMirror(event)); this.$table.on('click', '.js-delete-mirror', event => this.deleteMirror(event));
... ...
......
import $ from 'jquery'; import $ from 'jquery';
import _ from 'underscore'; import { escape as esc } from 'lodash';
import { __ } from '~/locale'; import { __ } from '~/locale';
import axios from '~/lib/utils/axios_utils'; import axios from '~/lib/utils/axios_utils';
import Flash from '~/flash'; import Flash from '~/flash';
...@@ -162,7 +162,7 @@ export default class SSHMirror { ...@@ -162,7 +162,7 @@ export default class SSHMirror {
const $fingerprintsList = this.$hostKeysInformation.find('.js-fingerprints-list'); const $fingerprintsList = this.$hostKeysInformation.find('.js-fingerprints-list');
let fingerprints = ''; let fingerprints = '';
sshHostKeys.fingerprints.forEach(fingerprint => { sshHostKeys.fingerprints.forEach(fingerprint => {
const escFingerprints = _.escape(fingerprint.fingerprint); const escFingerprints = esc(fingerprint.fingerprint);
fingerprints += `<code>${escFingerprints}</code>`; fingerprints += `<code>${escFingerprints}</code>`;
}); });
... ...
......
<script> <script>
import { mapActions, mapState } from 'vuex'; import { mapActions, mapState } from 'vuex';
import { GlAlert } from '@gitlab/ui'; import { GlAlert, GlSprintf, GlLink } from '@gitlab/ui';
import { sprintf, s__ } from '~/locale'; import { s__ } from '~/locale';
import { FETCH_SETTINGS_ERROR_MESSAGE } from '../../shared/constants'; import { FETCH_SETTINGS_ERROR_MESSAGE } from '../../shared/constants';
...@@ -11,22 +11,16 @@ export default { ...@@ -11,22 +11,16 @@ export default {
components: { components: {
SettingsForm, SettingsForm,
GlAlert, GlAlert,
GlSprintf,
GlLink,
}, },
computed: { i18n: {
...mapState(['isDisabled']), unavailableFeatureText: s__(
notAvailableMessage() {
return sprintf(
s__(
'ContainerRegistry|Currently, the Container Registry tag expiration feature is not available for projects created before GitLab version 12.8. For updates and more information, visit Issue %{linkStart}#196124%{linkEnd}', 'ContainerRegistry|Currently, the Container Registry tag expiration feature is not available for projects created before GitLab version 12.8. For updates and more information, visit Issue %{linkStart}#196124%{linkEnd}',
), ),
{
linkStart:
'<a href="https://gitlab.com/gitlab-org/gitlab/issues/196124" target="_blank" rel="noopener noreferrer">',
linkEnd: '</a>',
},
false,
);
}, },
computed: {
...mapState(['isDisabled']),
}, },
mounted() { mounted() {
this.fetchSettings().catch(() => this.fetchSettings().catch(() =>
...@@ -56,7 +50,15 @@ export default { ...@@ -56,7 +50,15 @@ export default {
</ul> </ul>
<settings-form v-if="!isDisabled" /> <settings-form v-if="!isDisabled" />
<gl-alert v-else :dismissible="false"> <gl-alert v-else :dismissible="false">
<p v-html="notAvailableMessage"></p> <p>
<gl-sprintf :message="$options.i18n.unavailableFeatureText">
<template #link="{content}">
<gl-link href="https://gitlab.com/gitlab-org/gitlab/issues/196124" target="_blank">
{{ content }}
</gl-link>
</template>
</gl-sprintf>
</p>
</gl-alert> </gl-alert>
</div> </div>
</template> </template>
<script> <script>
import { uniqueId } from 'lodash'; import { uniqueId } from 'lodash';
import { GlFormGroup, GlToggle, GlFormSelect, GlFormTextarea } from '@gitlab/ui'; import { GlFormGroup, GlToggle, GlFormSelect, GlFormTextarea, GlSprintf } from '@gitlab/ui';
import { s__, __, sprintf } from '~/locale'; import { s__, __ } from '~/locale';
import { NAME_REGEX_LENGTH } from '../constants'; import { NAME_REGEX_LENGTH } from '../constants';
import { mapComputedToEvent } from '../utils'; import { mapComputedToEvent } from '../utils';
...@@ -11,6 +11,7 @@ export default { ...@@ -11,6 +11,7 @@ export default {
GlToggle, GlToggle,
GlFormSelect, GlFormSelect,
GlFormTextarea, GlFormTextarea,
GlSprintf,
}, },
props: { props: {
formOptions: { formOptions: {
...@@ -70,27 +71,6 @@ export default { ...@@ -70,27 +71,6 @@ export default {
policyEnabledText() { policyEnabledText() {
return this.enabled ? __('enabled') : __('disabled'); return this.enabled ? __('enabled') : __('disabled');
}, },
toggleDescriptionText() {
return sprintf(
s__('ContainerRegistry|Docker tag expiration policy is %{toggleStatus}'),
{
toggleStatus: `<strong>${this.policyEnabledText}</strong>`,
},
false,
);
},
regexHelpText() {
return sprintf(
s__(
'ContainerRegistry|Wildcards such as %{codeStart}.*-stable%{codeEnd} or %{codeStart}production/.*%{codeEnd} are supported. To select all tags, use %{codeStart}.*%{codeEnd}',
),
{
codeStart: '<code>',
codeEnd: '</code>',
},
false,
);
},
nameRegexState() { nameRegexState() {
return this.name_regex ? this.name_regex.length <= NAME_REGEX_LENGTH : null; return this.name_regex ? this.name_regex.length <= NAME_REGEX_LENGTH : null;
}, },
...@@ -139,7 +119,15 @@ export default { ...@@ -139,7 +119,15 @@ export default {
v-model="enabled" v-model="enabled"
:disabled="isLoading" :disabled="isLoading"
/> />
<span class="mb-2 ml-1 lh-2" v-html="toggleDescriptionText"></span> <span class="mb-2 ml-1 lh-2">
<gl-sprintf
:message="s__('ContainerRegistry|Docker tag expiration policy is %{toggleStatus}')"
>
<template #toggleStatus>
<strong>{{ policyEnabledText }}</strong>
</template>
</gl-sprintf>
</span>
</div> </div>
</gl-form-group> </gl-form-group>
...@@ -190,7 +178,19 @@ export default { ...@@ -190,7 +178,19 @@ export default {
trim trim
/> />
<template #description> <template #description>
<span ref="regex-description" v-html="regexHelpText"></span> <span ref="regex-description">
<gl-sprintf
:message="
s__(
'ContainerRegistry|Wildcards such as %{codeStart}.*-stable%{codeEnd} or %{codeStart}production/.*%{codeEnd} are supported. To select all tags, use %{codeStart}.*%{codeEnd}',
)
"
>
<template #code="{content}">
<code>{{ content }}</code>
</template>
</gl-sprintf>
</span>
</template> </template>
</gl-form-group> </gl-form-group>
</div> </div>
... ...
......
...@@ -44,7 +44,6 @@ class Projects::IssuesController < Projects::ApplicationController ...@@ -44,7 +44,6 @@ class Projects::IssuesController < Projects::ApplicationController
before_action do before_action do
push_frontend_feature_flag(:vue_issuable_sidebar, project.group) push_frontend_feature_flag(:vue_issuable_sidebar, project.group)
push_frontend_feature_flag(:issue_link_types, project)
end end
around_action :allow_gitaly_ref_name_caching, only: [:discussions] around_action :allow_gitaly_ref_name_caching, only: [:discussions]
... ...
......
...@@ -161,7 +161,7 @@ class DiffNote < Note ...@@ -161,7 +161,7 @@ class DiffNote < Note
def positions_complete def positions_complete
return if self.original_position.complete? && self.position.complete? return if self.original_position.complete? && self.position.complete?
errors.add(:position, "is invalid") errors.add(:position, "is incomplete")
end end
def keep_around_commits def keep_around_commits
... ...
......
...@@ -16,7 +16,7 @@ module ChatMessage ...@@ -16,7 +16,7 @@ module ChatMessage
def initialize(params) def initialize(params)
@markdown = params[:markdown] || false @markdown = params[:markdown] || false
@project_name = params.dig(:project, :path_with_namespace) || params[:project_name] @project_name = params[:project_name] || params.dig(:project, :path_with_namespace)
@project_url = params.dig(:project, :web_url) || params[:project_url] @project_url = params.dig(:project, :web_url) || params[:project_url]
@user_full_name = params.dig(:user, :name) || params[:user_full_name] @user_full_name = params.dig(:user, :name) || params[:user_full_name]
@user_name = params.dig(:user, :username) || params[:user_name] @user_name = params.dig(:user, :username) || params[:user_name]
... ...
......
...@@ -157,7 +157,7 @@ class ChatNotificationService < Service ...@@ -157,7 +157,7 @@ class ChatNotificationService < Service
end end
def project_name def project_name
project.full_name.gsub(/\s/, '') project.full_name
end end
def project_url def project_url
... ...
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
- setting = project_incident_management_setting - setting = project_incident_management_setting
- templates = setting.available_issue_templates.map { |t| [t.name, t.key] } - templates = setting.available_issue_templates.map { |t| [t.name, t.key] }
%section.settings.no-animate.js-incident-management-settings %section.settings.no-animate.qa-incident-management-settings
.settings-header .settings-header
%h4= _('Incidents') %h4= _('Incidents')
%button.btn.js-settings-toggle{ type: 'button' } %button.btn.js-settings-toggle{ type: 'button' }
... ...
......
---
title: Do not remove space from project name in Slack
merge_request: 24851
author:
type: fixed
---
title: Parse filebeat modsec logs as JSON
merge_request: 24836
author:
type: changed
---
title: Fix usage ping timeouts with batch counters
merge_request: 22705
author:
type: performance
---
title: Replace underscore with lodash for ./app/assets/javascripts/mirrors
merge_request: 24967
author: Jacopo Beschi @jacopo-beschi
type: changed
---
title: Add blocking issues feature
merge_request: 24460
author:
type: added
---
title: Fix overriding the image pull policy from a values file for Auto Deploy
merge_request: 25271
author: robcalcroft
type: fixed
---
title: Fixed default-branch link under Pipeline Subscription settings
merge_request: 24834
author: James Johnson
type: fixed
---
title: Replace underscore with lodash for ./app/assets/javascripts/error_tracking
merge_request: 25143
author: Tobias Spagert
type: other