Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-07-17 18:30:38 +00:00
parent a4cfb7653b
commit 9d67de388b
127 changed files with 1571 additions and 303 deletions

View File

@ -13,6 +13,7 @@ globals:
IS_EE: false
plugins:
- no-jquery
- local-rules
settings:
import/resolver:
webpack:
@ -152,6 +153,7 @@ rules:
- '^router-link$'
- '^router-view$'
- '^gl-emoji$'
local-rules/require-valid-help-page-path: 'error'
overrides:
- files:
- '{,ee/,jh/}spec/frontend*/**/*'
@ -191,6 +193,7 @@ overrides:
message: '`/ee` or `/jh` path found in docs url, use `DOCS_URL_IN_EE_DIR` in `jh_else_ce/lib/utils/url_utility`'
no-unsanitized/method: off
no-unsanitized/property: off
local-rules/require-valid-help-page-path: off
- files:
- 'config/**/*'
- 'scripts/**/*'

View File

@ -216,7 +216,7 @@ graphql-schema-dump:
- .default-retry
- .ruby-cache
- .default-before_script
- .frontend:rules:default-frontend-jobs
- .frontend:rules:default-frontend-jobs-with-docs-changes
stage: fixtures
needs: []
script:
@ -408,6 +408,14 @@ jest-snapshot-vue3:
- jest-snapshot-test-match.json
- jest-snapshot-test-report.json
jest-linters:
extends:
- .frontend-test-base
- .frontend:rules:jest-linters
needs: []
script:
- run_timed_command "yarn jest:eslint --ci"
coverage-frontend:
extends:
- .default-retry

View File

@ -322,7 +322,7 @@
.ai-gateway-services:
services:
- name: registry.gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/model-gateway:v1.10.0
- name: registry.gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/model-gateway:v1.12.0
alias: ai-gateway
.use-pg13:

View File

@ -1282,6 +1282,12 @@
- <<: *if-default-refs
changes: *code-backstage-patterns
.frontend:rules:default-frontend-jobs-with-docs-changes:
rules:
- !reference [.frontend:rules:default-frontend-jobs, rules]
- <<: *if-default-refs
changes: *docs-patterns
# .frontend:rules:default-frontend-jobs, with a additional rules when MR is not approved
.frontend:rules:frontend_fixture:
rules:
@ -1458,6 +1464,12 @@
rules:
- <<: *if-default-branch-schedule-nightly
.frontend:rules:jest-linters:
rules:
- <<: *if-merge-request-labels-run-all-jest
- <<: *if-default-refs
changes: ["tooling/eslint-config/**/*", "spec/tooling/frontend/eslint-config/**/*"]
################
# Memory rules #
################

View File

@ -48,7 +48,7 @@ static-verification-with-database:
generate-apollo-graphql-schema:
extends:
- .static-analysis-base
- .frontend:rules:default-frontend-jobs
- .frontend:rules:default-frontend-jobs-with-docs-changes
image:
name: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:apollo
entrypoint: [""]
@ -67,7 +67,7 @@ eslint:
extends:
- .static-analysis-base
- .yarn-cache
- .frontend:rules:default-frontend-jobs
- .frontend:rules:default-frontend-jobs-with-docs-changes
needs: ['generate-apollo-graphql-schema']
variables:
USE_BUNDLE_INSTALL: "false"

View File

@ -16,7 +16,12 @@ config:
style: "atx"
hr-style: # MD035
style: "---"
line-length: false # MD013
line-length: # MD013
code_blocks: false
tables: false
headings: true
heading_line_length: 100
line_length: 800
no-duplicate-heading: # MD024
siblings_only: true
no-emphasis-as-heading: false # MD036

View File

@ -20,6 +20,7 @@ export default {
default: '',
},
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
docsLink: helpPagePath('development/service_ping/index.md'),
};
</script>

View File

@ -187,12 +187,14 @@ export const METRIC_TOOLTIPS = {
description: s__('ValueStreamAnalytics|Number of new issues created.'),
groupLink: '-/issues_analytics',
projectLink: '-/analytics/issues_analytics',
// eslint-disable-next-line local-rules/require-valid-help-page-path
docsLink: helpPagePath('user/analytics/issue_analytics'),
},
[FLOW_METRICS.ISSUES_COMPLETED]: {
description: s__('ValueStreamAnalytics|Number of issues closed by month.'),
groupLink: '-/issues_analytics',
projectLink: '-/analytics/issues_analytics',
// eslint-disable-next-line local-rules/require-valid-help-page-path
docsLink: helpPagePath('user/analytics/issue_analytics'),
},
[FLOW_METRICS.DEPLOYS]: {

View File

@ -653,7 +653,7 @@ export default {
'gl-overflow-hidden': disableScrollingWhenMutationInProgress,
'gl-overflow-y-auto': !disableScrollingWhenMutationInProgress,
}"
draggable=".board-card"
:draggable="canMoveIssue ? '.board-card' : false"
class="board-list gl-w-full gl-h-full gl-list-none gl-mb-0 gl-p-3 gl-pt-0 gl-overflow-x-hidden"
data-testid="tree-root-wrapper"
@start="handleDragOnStart"

View File

@ -139,6 +139,7 @@ export default {
: this.$options.i18n.runButtonText;
},
variableSettings() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath('ci/variables/index', { anchor: 'add-a-cicd-variable-to-a-project' });
},
},

View File

@ -67,6 +67,7 @@ export default {
},
wrapSymbols: ['::', '#', '.', '_', '-', '/', '\\'],
i18n,
// eslint-disable-next-line local-rules/require-valid-help-page-path
learnMorePath: helpPagePath('ci/testing/unit_test_reports', {
anchor: 'viewing-unit-test-reports-on-gitlab',
}),

View File

@ -10,6 +10,7 @@ export default {
GlSprintf,
HelpPopover,
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
runnerEntryHelpPath: helpPagePath('/runner/configuration/advanced-configuration.md', {
anchor: 'the-runners-section',
}),

View File

@ -75,6 +75,7 @@ export default {
deep: true,
},
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
HELP_LABELS_PAGE_PATH: helpPagePath('ci/runners/configure_runners', {
anchor: 'use-tags-to-control-which-jobs-a-runner-can-run',
}),

View File

@ -60,7 +60,7 @@ export default {
icons() {
return this.visible
? { caret: 'chevron-lg-down', folder: 'folder-open' }
: { caret: 'chevron-lg-right', folder: 'folder-o' };
: { caret: 'chevron-lg-right', folder: 'folder' };
},
label() {
return this.visible ? this.$options.i18n.collapse : this.$options.i18n.expand;

View File

@ -179,6 +179,7 @@ export default {
return this.pagination.next ? this.$options.NEXT_PAGE : null;
},
errorTrackingHelpUrl() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath('operations/error_tracking.html#integrated-error-tracking');
},
showIntegratedDisabledAlert() {

View File

@ -134,6 +134,7 @@ export default {
popoverBody: __('Project visibility level is less restrictive than the group settings.'),
learnMore: __('Learn more'),
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
shareProjectsWithGroupsHelpPagePath: helpPagePath(
'user/project/members/share_project_with_groups',
{

View File

@ -0,0 +1,93 @@
<script>
import { GlAlert, GlSprintf } from '@gitlab/ui';
import { s__ } from '~/locale';
import ResetApplicationSettingsModal from './reset_application_settings_modal.vue';
export const I18N_WEB_IDE_OAUTH_APPLICATION_CALLOUT = {
alertTitle: s__(
'IDE|Editing this application might affect the functionality of the Web IDE. Ensure the configuration meets the following conditions:',
),
alertButtonText: s__('IDE|Restore to default'),
configurations: [
s__(
'IDE|The redirect URI path is %{codeBlockStart}%{pathFormat}%{codeBlockEnd}. An example of a valid redirect URI is %{codeBlockStart}%{example}%{codeBlockEnd}.',
),
s__('IDE|The %{boldStart}Trusted%{boldEnd} checkbox is selected.'),
s__('IDE|The %{boldStart}Confidential%{boldEnd} checkbox is cleared.'),
s__('IDE|The %{boldStart}api%{boldEnd} scope is selected.'),
],
};
export default {
name: 'WebIdeOAuthApplicationCallout',
components: {
GlAlert,
GlSprintf,
ResetApplicationSettingsModal,
},
props: {
redirectUrlPath: {
type: String,
required: true,
},
resetApplicationSettingsPath: {
type: String,
required: true,
},
},
data() {
return {
isModalVisible: false,
};
},
methods: {
displayModal() {
this.isModalVisible = true;
},
hideModal() {
this.isModalVisible = false;
},
getRedirectUrl() {
return new URL(this.redirectUrlPath, window.location.origin);
},
},
i18n: I18N_WEB_IDE_OAUTH_APPLICATION_CALLOUT,
};
</script>
<template>
<div>
<reset-application-settings-modal
:visible="isModalVisible"
:reset-application-settings-path="resetApplicationSettingsPath"
@cancel="hideModal"
@close="hideModal"
/>
<gl-alert
variant="info"
class="gl-my-5"
:dismissible="false"
:primary-button-text="$options.i18n.alertButtonText"
@primaryAction="displayModal"
>
<p>{{ $options.i18n.alertTitle }}</p>
<ul class="gl-m-0">
<li v-for="(message, index) in $options.i18n.configurations" :key="index">
<gl-sprintf :message="message">
<template #bold="{ content }">
<strong>{{ content }}</strong>
</template>
<template #codeBlock="{ content }">
<code>{{
sprintf(content, {
pathFormat: redirectUrlPath,
example: `${getRedirectUrl()}`,
})
}}</code>
</template>
</gl-sprintf>
</li>
</ul>
</gl-alert>
</div>
</template>

View File

@ -0,0 +1,103 @@
<script>
import { GlAlert, GlModal } from '@gitlab/ui';
import { s__ } from '~/locale';
import axios from '~/lib/utils/axios_utils';
export const I18N_RESET_APPLICATION_SETTINGS_MODAL = {
errorMessage: s__(
'IDE|An error occurred while restoring the application to default. Please try again.',
),
title: s__('IDE|Restore application to default'),
body: s__(
'IDE|Are you sure you want to restore this application to its original configuration? All your changes will be lost.',
),
primaryButton: s__('IDE|Confirm'),
cancel: s__('IDE|Cancel'),
};
export default {
name: 'ResetApplicationSettingsModal',
components: {
GlAlert,
GlModal,
},
props: {
visible: {
type: Boolean,
required: true,
},
resetApplicationSettingsPath: {
type: String,
required: true,
},
},
data() {
return {
loading: false,
showErrorAlert: false,
};
},
computed: {
modalActionPrimary() {
return {
text: I18N_RESET_APPLICATION_SETTINGS_MODAL.primaryButton,
attributes: {
variant: 'danger',
id: 'confirm-restore-button',
loading: this.loading,
type: 'submit',
},
};
},
modalActionSecondary() {
return {
text: I18N_RESET_APPLICATION_SETTINGS_MODAL.cancel,
attributes: {
loading: this.loading,
},
};
},
},
methods: {
handlePrimaryButtonClick(event) {
event.preventDefault();
this.resetApplicationSetings();
},
async resetApplicationSetings() {
this.loading = true;
this.showErrorAlert = false;
try {
await axios.post(this.resetApplicationSettingsPath);
this.$refs.modal.hide();
window.location.reload();
} catch (e) {
this.showErrorAlert = true;
}
this.loading = false;
},
},
i18n: I18N_RESET_APPLICATION_SETTINGS_MODAL,
};
</script>
<template>
<gl-modal
ref="modal"
size="sm"
modal-id="reset-application-settings-modal"
:visible="visible"
:title="$options.i18n.title"
:action-primary="modalActionPrimary"
:action-secondary="modalActionSecondary"
v-bind="$attrs"
v-on="$listeners"
@primary="handlePrimaryButtonClick"
>
<div>
<gl-alert v-if="showErrorAlert" variant="danger" class="gl-mb-5" :dismissible="false">
{{ $options.i18n.errorMessage }}
</gl-alert>
<p>{{ $options.i18n.body }}</p>
</div>
</gl-modal>
</template>

View File

@ -0,0 +1,25 @@
import Vue from 'vue';
import WebIdeOAuthApplicationCallout from './components/oauth_application_callout.vue';
export const initWebIdeOAuthApplicationCallout = () => {
const el = document.querySelector('#web_ide_oauth_application_callout');
if (!el) {
return null;
}
const { redirectUrlPath, resetApplicationSettingsPath } = el.dataset;
return new Vue({
el,
name: 'WebIdeOAuthApplicationCallout',
render(h) {
return h(WebIdeOAuthApplicationCallout, {
props: {
redirectUrlPath,
resetApplicationSettingsPath,
},
});
},
});
};

View File

@ -26,7 +26,7 @@ export const BULK_IMPORT_STATIC_ITEMS = {
design: __('Design'),
project_feature: __('Project feature'),
protected_branches: __('Protected Branch'),
push_rule: __('Push Rule'),
push_rule: __('Push rule'),
repository: __('Repository'),
service_desk_setting: __('Service Desk'),
};

View File

@ -27,6 +27,7 @@ export default {
directives: {
GlTooltip: GlTooltipDirective,
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
projectCreationHelp: helpPagePath('user/group/import/index', {
anchor: 'ensure-projects-can-be-imported',
}),

View File

@ -44,6 +44,7 @@ export default {
},
},
i18n,
// eslint-disable-next-line local-rules/require-valid-help-page-path
learnMoreLink: helpPagePath('user/project/integrations/gitlab_slack_application', {
anchor: 'configuration',
}),

View File

@ -15,6 +15,7 @@ export default {
},
emptyStateSvg,
issuesHelpPagePath: helpPagePath('user/project/issues/index'),
// eslint-disable-next-line local-rules/require-valid-help-page-path
jiraIntegrationPath: helpPagePath('integration/jira/issues', { anchor: 'view-jira-issues' }),
components: {
CsvImportExportButtons,

View File

@ -11,6 +11,7 @@ export default {
GlLink,
},
i18n: timelineEventTagsPopover,
// eslint-disable-next-line local-rules/require-valid-help-page-path
learnMoreLink: helpPagePath('ee/operations/incident_management/incident_timeline_events', {
anchor: 'incident-tags',
}),

View File

@ -19,7 +19,7 @@ export default {
<template>
<div class="gl-display-flex gl-align-items-center">
<gl-icon name="folder-o" class="gl-mr-3" />
<gl-icon name="folder" class="gl-mr-3" />
<div class="gl-display-none gl-flex-shrink-0 gl-sm-display-flex gl-mr-3">
<gl-avatar
:size="32"

View File

@ -34,6 +34,7 @@ export const I18N_OAUTH_FAILED_MESSAGE = s__(
'JiraConnect|Ensure your instance URL is correct and your instance is configured correctly. %{linkStart}Learn more%{linkEnd}.',
);
// eslint-disable-next-line local-rules/require-valid-help-page-path
export const INTEGRATIONS_DOC_LINK = helpPagePath('integration/jira/development_panel', {
anchor: 'use-the-integration',
});
@ -52,6 +53,7 @@ export const JIRA_USER_REQUIREMENTS_DOC_LINK = helpPagePath(
anchor: 'jira-user-requirements',
},
);
// eslint-disable-next-line local-rules/require-valid-help-page-path
export const FAILED_TO_UPDATE_DOC_LINK = helpPagePath('administration/settings/jira_cloud_app', {
anchor: 'failed-to-update-the-gitlab-instance',
});

View File

@ -35,6 +35,7 @@ export default {
emptyStateValues() {
return {
...emptyStateTranslations[this.entityType],
// eslint-disable-next-line local-rules/require-valid-help-page-path
helpPath: helpPagePath('user/project/ml/model_registry/index', {
anchor: 'creating-machine-learning-models-and-model-versions',
}),

View File

@ -55,6 +55,7 @@ export default {
methods: {
openDocs() {
visitUrl(
// eslint-disable-next-line local-rules/require-valid-help-page-path
helpPagePath('user/project/ml/model_registry/index', {
anchor: 'creating-machine-learning-models-and-model-versions',
}),

View File

@ -33,6 +33,7 @@ export default {
},
},
mlflowDocs: s__('MlModelRegistry|Create using MLflow'),
// eslint-disable-next-line local-rules/require-valid-help-page-path
helpPath: helpPagePath('user/project/ml/model_registry/index', {
anchor: 'creating-machine-learning-models-and-model-versions',
}),

View File

@ -35,6 +35,7 @@ export default {
charactersOverLimit: (char) => n__('%d character over limit', '%d characters over limit', char),
},
formId: 'organization-form',
// eslint-disable-next-line local-rules/require-valid-help-page-path
markdownDocsPath: helpPagePath('user/organization/index', {
anchor: 'organization-description-supported-markdown',
}),

View File

@ -167,6 +167,7 @@ export const IMAGE_STATUS_ALERT_TYPE = {
[DELETE_FAILED]: 'warning',
};
// eslint-disable-next-line local-rules/require-valid-help-page-path
export const PACKAGE_DELETE_HELP_PAGE_PATH = helpPagePath(
'user/packages/container_registry/index',
{

View File

@ -1,5 +1,7 @@
import initApplicationDeleteButtons from '~/admin/applications';
import { initOAuthApplicationSecret } from '~/oauth_application';
import { initWebIdeOAuthApplicationCallout } from '~/ide/oauth_application_callout';
initApplicationDeleteButtons();
initOAuthApplicationSecret();
initWebIdeOAuthApplicationCallout();

View File

@ -43,6 +43,7 @@ const i18n = {
),
};
// eslint-disable-next-line local-rules/require-valid-help-page-path
const ciCatalogHelpPath = helpPagePath('ci/components/index', {
anchor: 'components-catalog',
});

View File

@ -19,6 +19,7 @@ export default {
GlLink,
GlFormCheckbox,
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
forcePushHelpPath: helpPagePath('topics/git/git_rebase', { anchor: 'force-push' }),
props: {
membersAllowedToPush: {

View File

@ -40,8 +40,11 @@ import {
EDIT_RULE_MODAL_ID,
} from './constants';
// eslint-disable-next-line local-rules/require-valid-help-page-path
const protectedBranchesHelpDocLink = helpPagePath(PROTECTED_BRANCHES_HELP_PATH);
// eslint-disable-next-line local-rules/require-valid-help-page-path
const codeOwnersHelpDocLink = helpPagePath(CODE_OWNERS_HELP_PATH);
// eslint-disable-next-line local-rules/require-valid-help-page-path
const pushRulesHelpDocLink = helpPagePath(PUSH_RULES_HELP_PATH);
export default {

View File

@ -5,6 +5,7 @@ import { s__ } from '~/locale';
import getProtectableBranches from '../graphql/queries/protectable_branches.query.graphql';
import { WILDCARDS_HELP_PATH } from '../constants';
// eslint-disable-next-line local-rules/require-valid-help-page-path
const wildcardsHelpDocLink = helpPagePath(WILDCARDS_HELP_PATH);
export default {
name: 'BranchRuleModal',

View File

@ -186,6 +186,7 @@ export default {
});
},
issuesHelpPagePath() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath('user/project/settings/index.md', {
anchor: 'configure-project-visibility-features-and-permissions',
});

View File

@ -21,6 +21,7 @@ export default {
i18n,
links: {
alertInfoMessageLink: helpPagePath('ci/yaml/index.html', { anchor: 'release' }),
// eslint-disable-next-line local-rules/require-valid-help-page-path
alertInfoPublishLink: helpPagePath('ci/components/index', { anchor: 'release-a-component' }),
},
components: {

View File

@ -217,6 +217,7 @@ export default {
this.$refs.form.$el.submit();
},
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
deleteLfsHelpPath: helpPagePath('topics/git/lfs/index', { anchor: 'removing-objects-from-lfs' }),
};
</script>

View File

@ -47,17 +47,21 @@ export default {
...mapState(['searchType', 'defaultBranchName', 'query', 'searchLevel', 'query']),
...mapGetters(['currentScope']),
zoektHelpUrl() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath(ZOEKT_HELP_PAGE);
},
zoektSyntaxHelpUrl() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath(ZOEKT_HELP_PAGE, {
anchor: ZOEKT_HELP_PAGE_SYNTAX_ANCHOR,
});
},
advancedSearchHelpUrl() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath(ADVANCED_SEARCH_HELP_PAGE);
},
advancedSearchSyntaxHelpUrl() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath(ADVANCED_SEARCH_HELP_PAGE, {
anchor: ADVANCED_SEARCH_SYNTAX_HELP_ANCHOR,
});

View File

@ -62,6 +62,7 @@ export default {
items: [
{
text: this.$options.i18n.help,
// eslint-disable-next-line local-rules/require-valid-help-page-path
href: helpPagePath(),
extraAttrs: {
...this.trackingAttrs('help'),

View File

@ -48,7 +48,7 @@ export default {
i18n: {
skipToMainContent: __('Skip to main content'),
primaryNavigation: s__('Navigation|Primary navigation'),
adminArea: s__('Navigation|Admin area'),
adminArea: s__('Navigation|Admin'),
},
inject: ['showTrialStatusWidget', 'showDuoProTrialStatusWidget'],
props: {

View File

@ -44,6 +44,7 @@ export default {
),
disableToggleWarning: s__('CICD|Disabling this feature is a permanent change.'),
},
// eslint-disable-next-line local-rules/require-valid-help-page-path
deprecationDocumentationLink: helpPagePath('ci/jobs/ci_job_token', {
anchor: 'limit-your-projects-job-token-access',
}),
@ -109,6 +110,7 @@ export default {
return this.targetProjectPath === '';
},
ciJobTokenHelpPage() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath('ci/jobs/ci_job_token#limit-your-projects-job-token-access');
},
disableTokenToggle() {

View File

@ -21,6 +21,7 @@ export const containerRegistryPopover = {
content: s__(
'UsageQuotas|Container Registry storage statistics are not used to calculate the total project storage. Total project storage is calculated after namespace container deduplication, where the total of all unique containers is added to the namespace storage total.',
),
// eslint-disable-next-line local-rules/require-valid-help-page-path
docsLink: helpPagePath(
'user/packages/container_registry/reduce_container_registry_storage.html',
{ anchor: 'check-container-registry-storage-use' },
@ -35,9 +36,11 @@ export const usageQuotasHelpPaths = {
anchor: 'repository-size-limit',
}),
usageQuotas: helpPagePath('user/usage_quotas'),
// eslint-disable-next-line local-rules/require-valid-help-page-path
usageQuotasProjectStorageLimit: helpPagePath('user/usage_quotas', {
anchor: 'project-storage-limit',
}),
// eslint-disable-next-line local-rules/require-valid-help-page-path
usageQuotasNamespaceStorageLimit: helpPagePath('user/usage_quotas', {
anchor: 'namespace-storage-limit',
}),

View File

@ -76,6 +76,7 @@ export default {
},
data() {
return {
// eslint-disable-next-line local-rules/require-valid-help-page-path
resolveConflictsFromCli: helpPagePath('user/project/merge_requests/conflicts', {
anchor: 'resolve-conflicts-from-the-command-line',
}),

View File

@ -96,6 +96,7 @@ export default {
text: s__(
'ciReport|New vulnerabilities are vulnerabilities that the security scan detects in the merge request that are different to existing vulnerabilities in the default branch.',
),
// eslint-disable-next-line local-rules/require-valid-help-page-path
learnMorePath: helpPagePath('user/application_security/index', {
anchor: 'view-security-scan-information-in-merge-requests',
}),

View File

@ -11,6 +11,7 @@ export const PIPELINE_MUST_SUCCEED_CONFLICT_TEXT = __(
export const PIPELINE_SKIPPED_STATUS = 'SKIPPED';
// TODO: Add documentation
// eslint-disable-next-line local-rules/require-valid-help-page-path
const MERGE_WHEN_CHECKS_PASS_HELP = helpPagePath(
'/user/project/merge_requests/merge_when_checks_pass.html',
);

View File

@ -28,6 +28,7 @@ export default {
},
computed: {
compiledHref() {
// eslint-disable-next-line local-rules/require-valid-help-page-path
return helpPagePath(this.href, { anchor: this.anchor });
},
attributes() {

View File

@ -13,20 +13,23 @@ export const splitDocument = (htmlString) => {
};
export const getRenderedMarkdown = (documentPath) => {
return axios
.get(helpPagePath(documentPath))
.then(({ data }) => {
const { body, title } = splitDocument(data);
return {
body,
title,
hasFetchError: false,
};
})
.catch((e) => {
Sentry.captureException(e);
return {
hasFetchError: true,
};
});
return (
axios
// eslint-disable-next-line local-rules/require-valid-help-page-path
.get(helpPagePath(documentPath))
.then(({ data }) => {
const { body, title } = splitDocument(data);
return {
body,
title,
hasFetchError: false,
};
})
.catch((e) => {
Sentry.captureException(e);
return {
hasFetchError: true,
};
})
);
};

View File

@ -70,6 +70,7 @@ export const AWS_EASY_BUTTONS = [
},
];
// eslint-disable-next-line local-rules/require-valid-help-page-path
export const LEGACY_REGISTER_HELP_URL = helpPagePath(
'architecture/blueprints/runner_tokens/index.md',
{

View File

@ -142,10 +142,12 @@ export default {
getWorkItemData() {
return {
confidential: this.isWorkItemConfidential,
// eslint-disable-next-line local-rules/require-valid-help-page-path
confidential_issues_docs_path: helpPagePath(this.workItemDocPath, {
anchor: this.workItemDocConfidentialAnchor,
}),
discussion_locked: this.isDiscussionLocked,
// eslint-disable-next-line local-rules/require-valid-help-page-path
locked_discussion_docs_path: helpPagePath(this.workItemDocPath, {
anchor: this.workItemDocLockedAnchor,
}),

View File

@ -23,6 +23,7 @@ export default {
},
},
constantOptions: {
// eslint-disable-next-line local-rules/require-valid-help-page-path
archivedProjectDocsPath: helpPagePath('user/project/settings/index.md', {
anchor: 'archive-a-project',
}),

View File

@ -58,6 +58,14 @@ class Admin::ApplicationsController < Admin::ApplicationController
redirect_to admin_applications_url, status: :found, notice: _('Application was successfully destroyed.')
end
def reset_web_ide_oauth_application_settings
success = ::WebIde::DefaultOauthApplication.reset_oauth_application_settings
return render json: {}, status: :internal_server_error unless success
render json: {}
end
private
def set_application

View File

@ -44,6 +44,7 @@ class Groups::GroupMembersController < Groups::ApplicationController
end
@members = present_group_members(non_invited_members)
@placeholder_users_count = placeholder_users_count
@requesters = present_members(
AccessRequestsFinder.new(@group).execute(current_user)
@ -104,6 +105,25 @@ class Groups::GroupMembersController < Groups::ApplicationController
def root_params_key
:group_member
end
def placeholder_users_count
{
pagination: {
total_items: placeholder_users.count,
awaiting_reassignment_items: placeholder_users.awaiting_reassignment.count,
reassigned_items: placeholder_users.reassigned.count
}
}
end
def placeholder_users
if Feature.enabled?(:importer_user_mapping, current_user)
Import::SourceUsersFinder.new(@group, current_user).execute
else
Import::SourceUser.none
end
end
strong_memoize_attr :placeholder_users
end
Groups::GroupMembersController.prepend_mod_with('Groups::GroupMembersController')

View File

@ -29,7 +29,7 @@ module ContainerRegistry
is_admin: current_user&.admin.to_s,
show_cleanup_policy_link: show_cleanup_policy_link(project).to_s,
show_container_registry_settings: show_container_registry_settings(project).to_s,
cleanup_policies_settings_path: project_settings_packages_and_registries_path(project),
cleanup_policies_settings_path: cleanup_image_tags_project_settings_packages_and_registries_path(project),
connection_error: (!!connection_error).to_s,
invalid_path_error: (!!invalid_path_error).to_s,
user_callouts_path: callouts_path,

View File

@ -5,7 +5,18 @@ module Groups::GroupMembersHelper
AVATAR_SIZE = 40
def group_members_app_data(group, members:, invited:, access_requests:, banned:, include_relations:, search:, pending_members:)
# rubocop:disable Metrics/ParameterLists -- all arguments needed
def group_members_app_data(
group,
members:,
invited:,
access_requests:,
banned:,
include_relations:,
search:,
pending_members:,
placeholder_users:
)
{
user: group_members_list_data(group, members, { param_name: :page, params: { invited_members_page: nil, search_invited: nil } }),
group: group_group_links_list_data(group, include_relations, search),
@ -16,9 +27,11 @@ module Groups::GroupMembersHelper
can_manage_access_requests: can?(current_user, :admin_member_access_request, group),
group_name: group.name,
group_path: group.full_path,
can_approve_access_requests: true # true for CE, overridden in EE
can_approve_access_requests: true, # true for CE, overridden in EE
placeholder: placeholder_users
}
end
# rubocop:enable Metrics/ParameterLists
def group_member_header_subtext(group)
ERB::Util.html_escape(_("You're viewing members of %{strong_start}%{group_name}%{strong_end}.").html_safe) % {

View File

@ -126,7 +126,7 @@ module IconsHelper
def file_type_icon_class(type, mode, name)
if type == 'folder'
'folder-o'
'folder'
elsif type == 'archive'
'archive'
elsif mode == '120000'

View File

@ -48,11 +48,10 @@ module PackagesHelper
end
def show_cleanup_policy_link(project)
Gitlab.com? &&
Gitlab.config.registry.enabled &&
show_container_registry_settings(project) &&
project.feature_available?(:container_registry, current_user) &&
project.container_expiration_policy.nil? &&
project.container_repositories.exists?
project.container_repositories.exists? &&
!project.container_expiration_policy&.enabled
end
def show_container_registry_settings(project)

View File

@ -22,6 +22,8 @@ module Import
scope :for_namespace, ->(namespace_id) { where(namespace_id: namespace_id) }
scope :by_statuses, ->(statuses) { where(status: statuses) }
scope :awaiting_reassignment, -> { where(status: [0, 1, 2, 3, 4]) }
scope :reassigned, -> { where(status: [5, 6]) }
state_machine :status, initial: :pending_reassignment do
state :pending_reassignment, value: 0

View File

@ -0,0 +1,3 @@
- return unless web_ide_oauth_application_id == application.id
#web_ide_oauth_application_callout{ :data => { :redirect_url_path => ide_oauth_redirect_path, :reset_application_settings_path => ide_reset_oauth_application_settings_path } }

View File

@ -2,6 +2,8 @@
- breadcrumb_title @application.name
- page_title _("Edit"), @application.name, _("Applications")
= render 'web_ide_oauth_application_callout', application: @application
%h1.page-title.gl-font-size-h-display
= _('Edit application')
- @url = admin_application_path(@application)

View File

@ -32,6 +32,7 @@
banned: @banned || [],
include_relations: @include_relations,
search: params[:search_groups],
pending_members: @pending_promotion_members
pending_members: @pending_promotion_members,
placeholder_users: @placeholder_users_count
).to_json } }
= gl_loading_icon(css_class: 'gl-my-5', size: 'md')

View File

@ -807,7 +807,7 @@ Gitlab.ee do
Settings.cron_jobs['elastic_migration_worker']['cron'] ||= '*/5 * * * *'
Settings.cron_jobs['elastic_migration_worker']['job_class'] ||= 'Elastic::MigrationWorker'
Settings.cron_jobs['search_zoekt_scheduling_worker'] ||= {}
Settings.cron_jobs['search_zoekt_scheduling_worker']['cron'] ||= '*/10 * * * *'
Settings.cron_jobs['search_zoekt_scheduling_worker']['cron'] ||= '*/1 * * * *'
Settings.cron_jobs['search_zoekt_scheduling_worker']['job_class'] ||= 'Search::Zoekt::SchedulingWorker'
Settings.cron_jobs['search_index_curation_worker'] ||= {}
Settings.cron_jobs['search_index_curation_worker']['cron'] ||= '*/1 * * * *'

View File

@ -164,6 +164,8 @@ InitializerConnections.raise_if_new_database_connection do
as: :remote,
to: 'web_ide/remote_ide#index',
constraints: { remote_host: %r{[^/?]+} }
post '/reset_oauth_application_settings' => 'admin/applications#reset_web_ide_oauth_application_settings'
end
draw :operations
@ -271,15 +273,7 @@ InitializerConnections.raise_if_new_database_connection do
end
end
resources(:groups, only: [:index, :new, :create]) do
# The constraints ensure that the `group_id` parameter in the URL allows for multiple levels
# of subgroups, permitting both regular and encoded slashes (%2F).
# Deprecated in favor of /groups/*group_id/-/preview_markdown
# https://gitlab.com/gitlab-org/gitlab/-/issues/442218
post :preview_markdown,
as: :preview_markdown_deprecated,
constraints: { group_id: %r{#{Gitlab::PathRegex.full_namespace_route_regex.source}(%2F#{Gitlab::PathRegex.full_namespace_route_regex.source})*} }
end
resources :groups, only: [:index, :new, :create]
draw :group

View File

@ -671,7 +671,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
post :unarchive
post :housekeeping
post :toggle_star
post :preview_markdown, as: :preview_markdown_deprecated
post :export
post :remove_export
post :generate_new_export

View File

@ -1,4 +1,4 @@
- title: "Scan execution policies enforcing scans with an `_EXCLUDED_ANALYZERS` variable will override project variables" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
- title: "Scan execution policies using `_EXCLUDED_ANALYZERS` variable override project variables" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
announcement_milestone: "16.9" # (required) The milestone when this feature was first announced as deprecated.
breaking_change: true # (required) Change to false if this is not a breaking change.

View File

@ -19,3 +19,4 @@ desired_sharding_key:
table: approval_group_rules
sharding_key: group_id
belongs_to: approval_group_rule
desired_sharding_key_migration_job_name: BackfillApprovalGroupRulesUsersGroupId

View File

@ -0,0 +1,9 @@
---
migration_job_name: BackfillApprovalGroupRulesUsersGroupId
description: Backfills sharding key `approval_group_rules_users.group_id` from `approval_group_rules`.
feature_category: source_code_management
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/159585
milestone: '17.2'
queued_migration_version: 20240716135356
finalize_after: '2024-08-22'
finalized_by: # version of the migration that finalized this BBM

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
class RemoveScanResultPolicyViolationsPolicyIdNotNull < Gitlab::Database::Migration[2.2]
milestone '17.3'
disable_ddl_transaction!
def up
execute "ALTER TABLE scan_result_policy_violations ALTER COLUMN scan_result_policy_id DROP NOT NULL"
end
def down
execute "ALTER TABLE scan_result_policy_violations ALTER COLUMN scan_result_policy_id SET NOT NULL"
end
end

View File

@ -0,0 +1,9 @@
# frozen_string_literal: true
class AddGroupIdToApprovalGroupRulesUsers < Gitlab::Database::Migration[2.2]
milestone '17.2'
def change
add_column :approval_group_rules_users, :group_id, :bigint
end
end

View File

@ -0,0 +1,17 @@
# frozen_string_literal: true
class AddApprovalPolicyIdConstraintToScanResultPolicyViolations < Gitlab::Database::Migration[2.2]
milestone '17.3'
disable_ddl_transaction!
CONSTRAINT_NAME = "chk_policy_violations_rule_id_or_policy_id_not_null"
def up
add_check_constraint :scan_result_policy_violations,
"approval_policy_rule_id IS NOT NULL OR scan_result_policy_id IS NOT NULL", CONSTRAINT_NAME
end
def down
remove_check_constraint :scan_result_policy_violations, CONSTRAINT_NAME
end
end

View File

@ -0,0 +1,16 @@
# frozen_string_literal: true
class IndexApprovalGroupRulesUsersOnGroupId < Gitlab::Database::Migration[2.2]
milestone '17.2'
disable_ddl_transaction!
INDEX_NAME = 'index_approval_group_rules_users_on_group_id'
def up
add_concurrent_index :approval_group_rules_users, :group_id, name: INDEX_NAME
end
def down
remove_concurrent_index_by_name :approval_group_rules_users, INDEX_NAME
end
end

View File

@ -0,0 +1,16 @@
# frozen_string_literal: true
class AddApprovalGroupRulesUsersGroupIdFk < Gitlab::Database::Migration[2.2]
milestone '17.2'
disable_ddl_transaction!
def up
add_concurrent_foreign_key :approval_group_rules_users, :namespaces, column: :group_id, on_delete: :cascade
end
def down
with_lock_retries do
remove_foreign_key :approval_group_rules_users, column: :group_id
end
end
end

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
class AddApprovalGroupRulesUsersGroupIdTrigger < Gitlab::Database::Migration[2.2]
milestone '17.2'
def up
install_sharding_key_assignment_trigger(
table: :approval_group_rules_users,
sharding_key: :group_id,
parent_table: :approval_group_rules,
parent_sharding_key: :group_id,
foreign_key: :approval_group_rule_id
)
end
def down
remove_sharding_key_assignment_trigger(
table: :approval_group_rules_users,
sharding_key: :group_id,
parent_table: :approval_group_rules,
parent_sharding_key: :group_id,
foreign_key: :approval_group_rule_id
)
end
end

View File

@ -0,0 +1,40 @@
# frozen_string_literal: true
class QueueBackfillApprovalGroupRulesUsersGroupId < Gitlab::Database::Migration[2.2]
milestone '17.2'
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
MIGRATION = "BackfillApprovalGroupRulesUsersGroupId"
DELAY_INTERVAL = 2.minutes
BATCH_SIZE = 1000
SUB_BATCH_SIZE = 100
def up
queue_batched_background_migration(
MIGRATION,
:approval_group_rules_users,
:id,
:group_id,
:approval_group_rules,
:group_id,
:approval_group_rule_id,
job_interval: DELAY_INTERVAL,
batch_size: BATCH_SIZE,
sub_batch_size: SUB_BATCH_SIZE
)
end
def down
delete_batched_background_migration(
MIGRATION,
:approval_group_rules_users,
:id,
[
:group_id,
:approval_group_rules,
:group_id,
:approval_group_rule_id
]
)
end
end

View File

@ -0,0 +1 @@
d4f8752b876eadad6821007240d02a834939877d5c8807379f48faaf39c5b34d

View File

@ -0,0 +1 @@
27e2a970e5e3f89527dedd4a9c0499b2aeb9236284b0174953d12f62ae4cd171

View File

@ -0,0 +1 @@
e95c6982f8bf967651a079288326d0d0615018f8a35cf43e756257a4808b24cd

View File

@ -0,0 +1 @@
072536ef93cd83373f93f8a987ac94b329d8b1bd88e7b00e7cc892d6e46e91e2

View File

@ -0,0 +1 @@
efdf58ce69f844117551d31ec10be11a6aa5a2e2230289a16c5892ace85f328a

View File

@ -0,0 +1 @@
bb18e03900dfcf86f3cb189a86dfc25bc6ad6a3a91d8289e677d23cae0657b20

View File

@ -0,0 +1 @@
ccd742985ca71edbf10fc4e9736ba75a2e5a9e2758d1495c62c3f44c997200b2

View File

@ -857,6 +857,22 @@ RETURN NEW;
END
$$;
CREATE FUNCTION trigger_158ac875f254() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW."group_id" IS NULL THEN
SELECT "group_id"
INTO NEW."group_id"
FROM "approval_group_rules"
WHERE "approval_group_rules"."id" = NEW."approval_group_rule_id";
END IF;
RETURN NEW;
END
$$;
CREATE FUNCTION trigger_174b23fa3dfb() RETURNS trigger
LANGUAGE plpgsql
AS $$
@ -5925,7 +5941,8 @@ ALTER SEQUENCE approval_group_rules_protected_branches_id_seq OWNED BY approval_
CREATE TABLE approval_group_rules_users (
id bigint NOT NULL,
approval_group_rule_id bigint NOT NULL,
user_id bigint NOT NULL
user_id bigint NOT NULL,
group_id bigint
);
CREATE SEQUENCE approval_group_rules_users_id_seq
@ -17189,7 +17206,7 @@ ALTER SEQUENCE scan_result_policies_id_seq OWNED BY scan_result_policies.id;
CREATE TABLE scan_result_policy_violations (
id bigint NOT NULL,
scan_result_policy_id bigint NOT NULL,
scan_result_policy_id bigint,
merge_request_id bigint NOT NULL,
project_id bigint NOT NULL,
created_at timestamp with time zone NOT NULL,
@ -17197,6 +17214,7 @@ CREATE TABLE scan_result_policy_violations (
violation_data jsonb,
approval_policy_rule_id bigint,
status smallint DEFAULT 1 NOT NULL
CONSTRAINT chk_policy_violations_rule_id_or_policy_id_not_null CHECK (((approval_policy_rule_id IS NOT NULL) OR (scan_result_policy_id IS NOT NULL)))
);
CREATE SEQUENCE scan_result_policy_violations_id_seq
@ -26155,6 +26173,8 @@ CREATE INDEX index_approval_group_rules_on_approval_policy_rule_id ON approval_g
CREATE INDEX index_approval_group_rules_on_scan_result_policy_id ON approval_group_rules USING btree (scan_result_policy_id);
CREATE INDEX index_approval_group_rules_users_on_group_id ON approval_group_rules_users USING btree (group_id);
CREATE INDEX index_approval_group_rules_users_on_user_id ON approval_group_rules_users USING btree (user_id);
CREATE UNIQUE INDEX index_approval_merge_request_rule_sources_1 ON approval_merge_request_rule_sources USING btree (approval_merge_request_rule_id);
@ -31749,6 +31769,8 @@ CREATE TRIGGER trigger_0e13f214e504 BEFORE INSERT OR UPDATE ON merge_request_ass
CREATE TRIGGER trigger_13d4aa8fe3dd BEFORE INSERT OR UPDATE ON draft_notes FOR EACH ROW EXECUTE FUNCTION trigger_13d4aa8fe3dd();
CREATE TRIGGER trigger_158ac875f254 BEFORE INSERT OR UPDATE ON approval_group_rules_users FOR EACH ROW EXECUTE FUNCTION trigger_158ac875f254();
CREATE TRIGGER trigger_174b23fa3dfb BEFORE INSERT OR UPDATE ON approval_project_rules_users FOR EACH ROW EXECUTE FUNCTION trigger_174b23fa3dfb();
CREATE TRIGGER trigger_18bc439a6741 BEFORE INSERT OR UPDATE ON packages_conan_metadata FOR EACH ROW EXECUTE FUNCTION trigger_18bc439a6741();
@ -32272,6 +32294,9 @@ ALTER TABLE ONLY protected_tag_create_access_levels
ALTER TABLE ONLY incident_management_timeline_events
ADD CONSTRAINT fk_38a74279df FOREIGN KEY (updated_by_user_id) REFERENCES users(id) ON DELETE SET NULL;
ALTER TABLE ONLY approval_group_rules_users
ADD CONSTRAINT fk_3995d73930 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
ALTER TABLE ONLY bulk_import_exports
ADD CONSTRAINT fk_39c726d3b5 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;

View File

@ -2354,7 +2354,7 @@ DELETE /groups/:id/share/:group_id
| `id` | integer/string | yes | The ID or [URL-encoded path of the group](rest/index.md#namespaced-path-encoding) |
| `group_id` | integer | yes | The ID of the group to share with |
## Push Rules
## Push rules
DETAILS:
**Tier:** Premium, Ultimate
@ -2558,13 +2558,13 @@ If successful, returns [`200 OK`](rest/index.md#status-codes) and
a JSON representation of the token. The attributes returned will vary by
token type.
Example request:
Example request
```shell
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"token":"glpat-1234567890abcdefghij"}' \
--data '{"token":"glpat-EXAMPLE"}' \
--url "https://gitlab.example.com/api/v4/groups/63/tokens/revoke"
```

View File

@ -33,17 +33,18 @@ This access can also [be restricted](#limit-job-token-scope-for-public-or-intern
|-------------------------------------------------------------------------------------------------------|--------------------|
| [Container registry API](../../api/container_registry.md) | The token is scoped to the container registry of the job's project only. |
| [Container registry](../../user/packages/container_registry/build_and_push_images.md#use-gitlab-cicd) | The `$CI_REGISTRY_PASSWORD` [predefined variable](../variables/predefined_variables.md) is the CI/CD job token. |
| [Deployments API](../../api/deployments.md) | `GET` requests are public by default. |
| [Environments API](../../api/environments.md) | `GET` requests are public by default. |
| [Job artifacts API](../../api/job_artifacts.md#get-job-artifacts) | `GET` requests are public by default. |
| [Jobs API](../../api/jobs.md#get-job-tokens-job) | To get the job token's job. |
| [Package registry](../../user/packages/package_registry/index.md#to-build-packages) | |
| [Deployments API](../../api/deployments.md) | `GET` requests are public by default. |
| [Environments API](../../api/environments.md) | `GET` requests are public by default. |
| [Job artifacts API](../../api/job_artifacts.md#get-job-artifacts) | `GET` requests are public by default. |
| [Jobs API](../../api/jobs.md#get-job-tokens-job) | To get the job token's job. |
| [Package registry](../../user/packages/package_registry/index.md#to-build-packages) | |
| [Packages API](../../api/packages.md) | `GET` requests are public by default. |
| [Pipeline triggers](../../api/pipeline_triggers.md) | Used with the `token=` parameter to [trigger a multi-project pipeline](../pipelines/downstream_pipelines.md#trigger-a-multi-project-pipeline-by-using-the-api). |
| [Pipelines API](../../api/pipelines.md#update-pipeline-metadata) | To update pipeline metadata. |
| [Release links API](../../api/releases/links.md) | |
| [Release links API](../../api/releases/links.md) | |
| [Releases API](../../api/releases/index.md) | `GET` requests are public by default. |
| [Terraform plan](../../user/infrastructure/index.md) | |
| [Secure files](../secure_files/index.md#use-secure-files-in-cicd-jobs) | The `download-secure-files` tool authenticates with a CI/CD job token by default. |
| [Terraform plan](../../user/infrastructure/index.md) | |
A job token can access a project's resources without any configuration, but it might
give extra permissions that aren't necessary. There is [a proposal](https://gitlab.com/groups/gitlab-org/-/epics/3559)

View File

@ -32,7 +32,9 @@ The chat aims to be context aware and ultimately have access to all the resource
To scale the context awareness and hence to scale creation, ideation, and learning use cases across the entire DevSecOps domain, the Duo Chat team welcomes contributions to the chat platform from other GitLab teams and the wider community. They are the experts for the use cases and workflows to accelerate.
### Which use cases are better implemented as stand-alone AI features or at least also as stand-alone AI features?
### Which use cases are better implemented as stand-alone AI features?
Which use cases are better implemented as stand-alone AI features, or at least also as stand-alone AI features?
- Narrowly scoped tasks that be can accelerated by deeply integrating AI into an existing workflow.
- That can't benefit from conversations with AI.

View File

@ -9,10 +9,7 @@ info: Any user with at least the Maintainer role can merge updates to this conte
This page describes which database changes require GitLab upgrade stops. If you're interested
about a comprehensive list of causes, refer to [causes of required stops](../avoiding_required_stops.md#causes-of-required-stops).
[Required stops](../../update/index.md#upgrade-paths) should only be added when it is deemed absolutely necessary, because of their
disruptive effect on customers. Before adding a required stop, consider if any
alternative approaches exist to avoid a required stop. Sometimes a required
stop is unavoidable. In those cases, follow the instructions below.
[Required stops](../../update/index.md#upgrade-paths) will now consistently land on minor versions X.2, X.5, X.8 and X.11. This is to ensure predictable upgrade paths for users. Any changes to the database that require a stop can make use of these releases. The instructions below are used to add required upgrade stops.
## Common database changes that require stops

View File

@ -43,7 +43,8 @@ You should avoid:
In general, for topic titles:
- Be clear and direct. Make every word count.
- Use fewer than 70 characters when possible.
- Use fewer than 70 characters when possible. The [markdownlint](../testing/markdownlint.md) rule:
[`line-length` (MD013)](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.markdownlint-cli2.yaml)
- Use articles and prepositions.
- Follow [capitalization](../styleguide/index.md#topic-titles) guidelines.
- Do not repeat text from earlier topic titles. For example, if the page is about merge requests,

View File

@ -2000,7 +2000,7 @@ If you applied customizations to the removed analyzers, or if you currently disa
<div class="deprecation breaking-change" data-milestone="17.0">
### Scan execution policies enforcing scans with an `_EXCLUDED_ANALYZERS` variable will override project variables
### Scan execution policies using `_EXCLUDED_ANALYZERS` variable override project variables
<div class="deprecation-notes">
- Announced in GitLab <span class="milestone">16.9</span>

View File

@ -202,6 +202,8 @@ later versions. When moving through an upgrade path:
1. Allow the background migrations for the upgrade to finish.
1. Upgrade to the next required upgrade stop.
From GitLab 17.5, required upgrade stops consistently land on minor versions X.2, X.5, X.8, and X.11. This schedule provides a predictable upgrade schedule for instance administrators.
To determine your upgrade path:
1. Note where in the upgrade path your current version sits, including required upgrade stops:

View File

@ -73,7 +73,15 @@ After a security advisory is published, it might take a few hours before the cor
## When vulnerabilities are no longer detected
Continuous Vulnerability Scanning automatically creates vulnerabilities when a new advisory is published but it is not able to tell when a vulnerability is no longer present in the project. To do so, GitLab still requires to have a [Container Scanning](../container_scanning/index.md) or a [Dependency Scanning](../dependency_scanning/index.md) scan executed in a pipeline for the default branch, and a corresponding security report artifact generated with the up to date information. When these reports are processed, and when they no longer contain some vulnerabilities, these are flagged as such even if they were created by Continuous Vulnerability Scanning. This behavior has been introduced in 17.1 with [issue 441490](https://gitlab.com/gitlab-org/gitlab/-/issues/441490) and applies to scanners maintained by GitLab (`Trivy`, `gemnasium`, `gemnasium-python`, `gemnasium-maven`).
Continuous Vulnerability Scanning automatically creates vulnerabilities when a new advisory is published
but it is not able to tell when a vulnerability is no longer present in the project. To do so, GitLab
still requires to have a [Container Scanning](../container_scanning/index.md) or a
[Dependency Scanning](../dependency_scanning/index.md) scan executed in a pipeline for the default branch,
and a corresponding security report artifact generated with the up to date information. When these reports
are processed, and when they no longer contain some vulnerabilities, these are flagged as such even if
they were created by Continuous Vulnerability Scanning. This behavior has been introduced in 17.1 with
[issue 441490](https://gitlab.com/gitlab-org/gitlab/-/issues/441490) and applies to scanners maintained
by GitLab (`Trivy`, `gemnasium`, `gemnasium-python`, `gemnasium-maven`).
Improvements to this behavior, including requiring only to have a updated SBOM uploaded, are planned in [epic 8026](https://gitlab.com/groups/gitlab-org/-/epics/8026).

View File

@ -28,3 +28,7 @@ Your text is checked for the following secret types:
- GitLab [feed tokens](../../../../security/token_overview.md#feed-token)
To track the development of this feature, see [issue 405147](https://gitlab.com/gitlab-org/gitlab/-/issues/405147).
## Related topics
- [Push rules](../../../project/repository/push_rules.md)

View File

@ -122,7 +122,7 @@ There's no exact formula to reliably estimate a migration. However, the average
| Auto DevOps | 0.1 |
| Pipeline Schedules | 0.5 |
| References | 5 |
| Push Rule | 0.1 |
| Push rule | 0.1 |
Though it's difficult to predict migration duration, we've seen:

View File

@ -1989,11 +1989,11 @@ For example:
- The issues designs tab: `"https://gitlab.com/gitlab-org/gitlab/-/issues/1234/designs"`, rendered as `#1234 (designs)`.
- Links to individual designs: `"https://gitlab.com/gitlab-org/gitlab/-/issues/1234/designs/layout.png"`, rendered as `#1234[layout.png]`.
### Show the issue, merge request, or epic title in the reference
### Show item title
> - Support for work items [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390854) in GitLab 16.0.
> - Support for work items (tasks, objectives, and key results) [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390854) in GitLab 16.0.
To include the title in the rendered link of an issue, work item, merge request, or epic:
To include the title in the rendered link of an issue, task, objective, key result, merge request, or epic:
- Add a plus (`+`) at the end of the reference.
@ -2001,12 +2001,12 @@ For example, a reference like `#123+` is rendered as `The issue title (#123)`.
URL references like `https://gitlab.com/gitlab-org/gitlab/-/issues/1234+` are also expanded.
### Show the issue, work item or merge request summary in the reference
### Show item summary
> - Support for issues and merge requests [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/386937) in GitLab 15.10.
> - Support for work items [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390854) in GitLab 16.0.
> - Support for work items (tasks, objectives, and key results) [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/390854) in GitLab 16.0.
To include an extended summary in the rendered link of an issue, work item, or merge request:
To include an extended summary in the rendered link of an issue, task, objective, key result, or merge request:
- Add a `+s` at the end of the reference.

View File

@ -291,6 +291,7 @@ to use them as standard characters in a match condition.
- [Signing commits with SSH](signed_commits/ssh.md)
- [Signing commits with X.509](signed_commits/x509.md)
- [Protected branches](../protected_branches.md)
- [Client-side secret detection](../../application_security/secret_detection/client/index.md)
## Troubleshooting

View File

@ -1,10 +1,10 @@
---
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__001:
api_request_override_path: /groups/glfm_group/preview_markdown
api_request_override_path: /groups/glfm_group/-/preview_markdown
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__002:
api_request_override_path: /glfm_group/glfm_project/preview_markdown
api_request_override_path: /glfm_group/glfm_project/-/preview_markdown
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__003:
api_request_override_path: /glfm_group/glfm_project/preview_markdown
api_request_override_path: /glfm_group/glfm_project/-/preview_markdown
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__004:
api_request_override_path: /-/snippets/preview_markdown
08_03_00__gitlab_internal_extension_markdown__markdown_preview_api_request_overrides__005:
@ -13,15 +13,15 @@
ee: true
api_request_override_path: /groups/glfm_group/-/wikis/new_page/preview_markdown
08_04_01__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_image_for_group__001:
api_request_override_path: /groups/glfm_group/preview_markdown
api_request_override_path: /groups/glfm_group/-/preview_markdown
08_04_02__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_image_for_project__001:
api_request_override_path: /glfm_group/glfm_project/preview_markdown
api_request_override_path: /glfm_group/glfm_project/-/preview_markdown
08_04_03__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_image_for_project_wiki__001:
api_request_override_path: /glfm_group/glfm_project/-/wikis/new_page/preview_markdown
08_04_04__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_group__001:
api_request_override_path: /groups/glfm_group/preview_markdown
api_request_override_path: /groups/glfm_group/-/preview_markdown
08_04_05__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_project__001:
api_request_override_path: /glfm_group/glfm_project/preview_markdown
api_request_override_path: /glfm_group/glfm_project/-/preview_markdown
08_04_06__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_project_wiki__001:
api_request_override_path: /glfm_group/glfm_project/-/wikis/new_page/preview_markdown
08_04_07__gitlab_internal_extension_markdown__migrated_golden_master_examples__attachment_link_for_group_wiki__001:

7
jest.config.eslint.js Normal file
View File

@ -0,0 +1,7 @@
module.exports = {
testMatch: ['<rootDir>/spec/tooling/frontend/eslint-config/**/*@([._])spec.js'],
transform: {
'^.+\\.js$': 'babel-jest',
},
transformIgnorePatterns: [`node_modules/`],
};

View File

@ -0,0 +1,10 @@
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
class BackfillApprovalGroupRulesUsersGroupId < BackfillDesiredShardingKeyJob
operation_name :backfill_approval_group_rules_users_group_id
feature_category :source_code_management
end
end
end

View File

@ -25,6 +25,12 @@ module WebIde
URI.extract(oauth_application.redirect_uri, %w[http https]).uniq
end
def reset_oauth_application_settings
return unless oauth_application
oauth_application.update!(default_settings)
end
def ensure_oauth_application!
return if oauth_application
@ -35,17 +41,12 @@ module WebIde
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132496#note_1587293087
application_settings.lock!
# note: `lock!`` breaks applicaiton_settings cache and will trigger another query.
# note: `lock!`` breaks application_settings cache and will trigger another query.
# We need to double check here so that requests previously waiting on the lock can
# now just skip.
next if oauth_application
application = Doorkeeper::Application.new(
name: 'GitLab Web IDE',
redirect_uri: oauth_callback_url,
scopes: ['api'],
trusted: true,
confidential: false)
application = Doorkeeper::Application.new(default_settings)
application.save!
application_settings.update!(web_ide_oauth_application: application)
should_expire_cache = true
@ -60,6 +61,16 @@ module WebIde
def application_settings
::Gitlab::CurrentSettings.current_application_settings
end
def default_settings
{
"name" => 'GitLab Web IDE',
"redirect_uri" => oauth_callback_url,
"scopes" => ['api'],
"trusted" => true,
"confidential" => false
}.freeze
end
end
end
end

View File

@ -26513,6 +26513,15 @@ msgstr ""
msgid "IDE"
msgstr ""
msgid "IDE|An error occurred while restoring the application to default. Please try again."
msgstr ""
msgid "IDE|Are you sure you want to restore this application to its original configuration? All your changes will be lost."
msgstr ""
msgid "IDE|Cancel"
msgstr ""
msgid "IDE|Cannot open Web IDE"
msgstr ""
@ -26522,12 +26531,18 @@ msgstr ""
msgid "IDE|Commit to %{branchName} branch"
msgstr ""
msgid "IDE|Confirm"
msgstr ""
msgid "IDE|Contact your administrator or try to open the Web IDE again with another domain."
msgstr ""
msgid "IDE|Edit"
msgstr ""
msgid "IDE|Editing this application might affect the functionality of the Web IDE. Ensure the configuration meets the following conditions:"
msgstr ""
msgid "IDE|Error reloading page"
msgstr ""
@ -26546,6 +26561,12 @@ msgstr ""
msgid "IDE|Reopen with other domain"
msgstr ""
msgid "IDE|Restore application to default"
msgstr ""
msgid "IDE|Restore to default"
msgstr ""
msgid "IDE|Review"
msgstr ""
@ -26555,9 +26576,21 @@ msgstr ""
msgid "IDE|Successful commit"
msgstr ""
msgid "IDE|The %{boldStart}Confidential%{boldEnd} checkbox is cleared."
msgstr ""
msgid "IDE|The %{boldStart}Trusted%{boldEnd} checkbox is selected."
msgstr ""
msgid "IDE|The %{boldStart}api%{boldEnd} scope is selected."
msgstr ""
msgid "IDE|The URL you're using to access the Web IDE and the configured OAuth callback URL do not match. This issue often occurs when you're using a proxy."
msgstr ""
msgid "IDE|The redirect URI path is %{codeBlockStart}%{pathFormat}%{codeBlockEnd}. An example of a valid redirect URI is %{codeBlockStart}%{example}%{codeBlockEnd}."
msgstr ""
msgid "IDE|This option is disabled because you are not allowed to create merge requests in this project."
msgstr ""
@ -34420,6 +34453,9 @@ msgstr ""
msgid "Navigation|%{title} removed from pinned items"
msgstr ""
msgid "Navigation|Admin"
msgstr ""
msgid "Navigation|Admin area"
msgstr ""
@ -43272,12 +43308,6 @@ msgstr ""
msgid "Push"
msgstr ""
msgid "Push Rule"
msgstr ""
msgid "Push Rule updated successfully."
msgstr ""
msgid "Push an existing Git repository"
msgstr ""
@ -43302,6 +43332,12 @@ msgstr ""
msgid "Push project from command line"
msgstr ""
msgid "Push rule"
msgstr ""
msgid "Push rule updated successfully."
msgstr ""
msgid "Push rules"
msgstr ""
@ -52181,6 +52217,9 @@ msgstr ""
msgid "SuperSonics|I agree that my use of the GitLab Software is subject to the Subscription Agreement located at the %{linkStart}Terms of Service%{linkEnd}, unless otherwise agreed to in writing with GitLab."
msgstr ""
msgid "SuperSonics|Instance subscription"
msgstr ""
msgid "SuperSonics|Learn how to %{linkStart}activate your subscription%{linkEnd}."
msgstr ""
@ -52274,9 +52313,6 @@ msgstr ""
msgid "SuperSonics|Your future dated license was successfully added"
msgstr ""
msgid "SuperSonics|Your subscription"
msgstr ""
msgid "SuperSonics|Your subscription cannot be located"
msgstr ""

Some files were not shown because too many files have changed in this diff Show More