Add latest changes from gitlab-org/gitlab@master
|
@ -1139,7 +1139,6 @@ Gitlab/NamespacedClass:
|
||||||
- ee/app/workers/project_template_export_worker.rb
|
- ee/app/workers/project_template_export_worker.rb
|
||||||
- ee/app/workers/pseudonymizer_worker.rb
|
- ee/app/workers/pseudonymizer_worker.rb
|
||||||
- ee/app/workers/refresh_license_compliance_checks_worker.rb
|
- ee/app/workers/refresh_license_compliance_checks_worker.rb
|
||||||
- ee/app/workers/repository_push_audit_event_worker.rb
|
|
||||||
- ee/app/workers/repository_update_mirror_worker.rb
|
- ee/app/workers/repository_update_mirror_worker.rb
|
||||||
- ee/app/workers/scan_security_report_secrets_worker.rb
|
- ee/app/workers/scan_security_report_secrets_worker.rb
|
||||||
- ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb
|
- ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb
|
||||||
|
|
|
@ -348,7 +348,6 @@ Layout/HashAlignment:
|
||||||
- 'ee/app/models/scim_identity.rb'
|
- 'ee/app/models/scim_identity.rb'
|
||||||
- 'ee/app/models/status_page/project_setting.rb'
|
- 'ee/app/models/status_page/project_setting.rb'
|
||||||
- 'ee/app/serializers/ee/evidences/release_entity.rb'
|
- 'ee/app/serializers/ee/evidences/release_entity.rb'
|
||||||
- 'ee/app/services/audit_events/repository_push_audit_event_service.rb'
|
|
||||||
- 'ee/app/services/ci/external_pull_requests/process_github_event_service.rb'
|
- 'ee/app/services/ci/external_pull_requests/process_github_event_service.rb'
|
||||||
- 'ee/app/services/ci_cd/setup_project.rb'
|
- 'ee/app/services/ci_cd/setup_project.rb'
|
||||||
- 'ee/app/services/ee/issues/base_service.rb'
|
- 'ee/app/services/ee/issues/base_service.rb'
|
||||||
|
|
After Width: | Height: | Size: 7.3 KiB |
|
@ -1 +1,12 @@
|
||||||
<svg width="100" height="32" xmlns="http://www.w3.org/2000/svg"><g fill-rule="nonzero" fill="none"><path fill="#8C929D" d="M67.67 8.11h-2.06l.009 15.364h8.348v-1.9H67.68l-.01-13.465zM81.913 20.778a3.517 3.517 0 01-2.553 1.078c-1.57 0-2.203-.775-2.203-1.787 0-1.522 1.059-2.25 3.309-2.25.487.002.974.04 1.456.113v2.846h-.01zm-2.137-9.313a6.826 6.826 0 00-4.387 1.579l.728 1.267c.841-.492 1.872-.983 3.356-.983 1.693 0 2.44.87 2.44 2.326v.747a9.4 9.4 0 00-1.428-.114c-3.612 0-5.446 1.267-5.446 3.914 0 2.374 1.456 3.565 3.659 3.565 1.484 0 2.912-.68 3.404-1.787l.378 1.503h1.456v-7.866c-.01-2.487-1.087-4.151-4.16-4.151zM90.587 21.926c-.776 0-1.456-.094-1.967-.33v-7.102c.7-.586 1.57-1.011 2.676-1.011 1.995 0 2.76 1.408 2.76 3.687 0 3.234-1.238 4.756-3.47 4.756m.87-10.457a3.775 3.775 0 00-2.836 1.257V10.74l-.01-2.629h-2.013l.01 14.987c1.01.425 2.391.652 3.895.652 3.848 0 5.701-2.458 5.701-6.704-.01-3.356-1.72-5.578-4.746-5.578M45.228 9.776c1.825 0 3.006.605 3.772 1.22l.889-1.541c-1.2-1.06-2.827-1.627-4.567-1.627-4.387 0-7.46 2.676-7.46 8.075 0 5.654 3.319 7.857 7.11 7.857a12.083 12.083 0 004.577-.888L49.5 16.83v-1.9h-5.63v1.9h3.594l.047 4.586c-.473.236-1.286.425-2.392.425-3.045 0-5.087-1.92-5.087-5.957-.01-4.113 2.1-6.108 5.19-6.108M59.744 8.107H57.73l.01 2.582v8.916c0 2.487 1.078 4.15 4.15 4.15.416.002.83-.036 1.24-.113v-1.806c-.31.047-.624.07-.937.066-1.692 0-2.44-.87-2.44-2.326v-6.145h3.376v-1.683h-3.373l-.009-3.64h-.003zM52.608 23.474h2.014V11.75h-2.014zM52.608 10.133h2.014V8.119h-2.014z"/><path d="M31.864 17.907l-1.788-5.496-3.538-10.9a.612.612 0 00-1.16 0L21.84 12.406H10.085L6.547 1.512a.612.612 0 00-1.16 0L1.855 12.405.066 17.907c-.162.5.015 1.05.44 1.36L15.963 30.5l15.456-11.233a1.22 1.22 0 00.446-1.36" fill="#FC6D26"/><path d="M15.966 30.49l5.875-18.086H10.09z" fill="#E24329"/><path d="M15.962 30.49l-5.877-18.086H1.859z" fill="#FC6D26"/><path d="M1.852 12.41L.063 17.906c-.162.5.015 1.05.441 1.36L15.959 30.5 1.852 12.41z" fill="#FCA326"/><path d="M1.854 12.41h8.237L6.546 1.517a.612.612 0 00-1.16 0L1.854 12.41z" fill="#E24329"/><path d="M15.966 30.49l5.875-18.086h8.236z" fill="#FC6D26"/><path d="M30.074 12.41l1.79 5.496a1.219 1.219 0 01-.44 1.36L15.966 30.49l14.107-18.08z" fill="#FCA326"/><path d="M30.079 12.41H21.84L25.38 1.517a.612.612 0 011.16 0l3.539 10.893z" fill="#E24329"/></g></svg>
|
<svg width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
|
||||||
|
fill="#171321"/>
|
||||||
|
<path d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#E24329"/>
|
||||||
|
<path d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
<path d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
|
||||||
|
fill="#FCA326"/>
|
||||||
|
<path d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 390 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 373 B |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 591 B |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
@ -1,26 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg width="200" height="192" class="tanuki-logo" viewBox="0 0 50 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<svg width="210px" height="210px" viewBox="0 0 210 210" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
<path class="tanuki-shape tanuki" d="m49.014 19-.067-.18-6.784-17.696a1.792 1.792 0 0 0-3.389.182l-4.579 14.02H15.651l-4.58-14.02a1.795 1.795 0 0 0-3.388-.182l-6.78 17.7-.071.175A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869 10.394-7.779.029-.022a12.595 12.595 0 0 0 4.182-14.554Z"
|
||||||
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
|
fill="#E24329"/>
|
||||||
<title>Slice 1</title>
|
<path class="tanuki-shape right-cheek" d="m49.014 19-.067-.18a22.88 22.88 0 0 0-9.12 4.103L24.931 34.187l9.485 7.167 10.393-7.779.03-.022a12.595 12.595 0 0 0 4.175-14.554Z"
|
||||||
<desc>Created with Sketch.</desc>
|
fill="#FC6D26"/>
|
||||||
<defs></defs>
|
<path class="tanuki-shape chin" d="m15.414 41.354 5.12 3.87 3.11 2.351a2.102 2.102 0 0 0 2.535 0l3.11-2.352 5.12-3.869-9.484-7.167-9.51 7.167Z"
|
||||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
fill="#FCA326"/>
|
||||||
<g id="logo" sketch:type="MSLayerGroup" transform="translate(0.000000, 10.000000)">
|
<path class="tanuki-shape left-cheek" d="M10.019 22.923a22.86 22.86 0 0 0-9.117-4.1L.832 19A12.595 12.595 0 0 0 5.01 33.556l.026.02.057.044 10.32 7.734 9.491-7.167L10.02 22.923Z"
|
||||||
<g id="Page-1" sketch:type="MSShapeGroup">
|
fill="#FC6D26"/>
|
||||||
<g id="Fill-1-+-Group-24">
|
|
||||||
<g id="Group-24">
|
|
||||||
<g id="Group">
|
|
||||||
<path d="M105.0614,193.655 L105.0614,193.655 L143.7014,74.734 L66.4214,74.734 L105.0614,193.655 L105.0614,193.655 Z" id="Fill-4" fill="#E24329" class="tanuki-shape"></path>
|
|
||||||
<path d="M105.0614,193.6548 L66.4214,74.7338 L12.2684,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-8" fill="#FC6D26" class="tanuki-shape"></path>
|
|
||||||
<path d="M12.2685,74.7341 L12.2685,74.7341 L0.5265,110.8731 C-0.5445,114.1691 0.6285,117.7801 3.4325,119.8171 L105.0615,193.6551 L12.2685,74.7341 L12.2685,74.7341 Z" id="Fill-12" fill="#FCA326" class="tanuki-shape"></path>
|
|
||||||
<path d="M12.2685,74.7342 L66.4215,74.7342 L43.1485,3.1092 C41.9515,-0.5768 36.7375,-0.5758 35.5405,3.1092 L12.2685,74.7342 L12.2685,74.7342 Z" id="Fill-16" fill="#E24329" class="tanuki-shape"></path>
|
|
||||||
<path d="M105.0614,193.6548 L143.7014,74.7338 L197.8544,74.7338 L105.0614,193.6548 L105.0614,193.6548 Z" id="Fill-18" fill="#FC6D26" class="tanuki-shape"></path>
|
|
||||||
<path d="M197.8544,74.7341 L197.8544,74.7341 L209.5964,110.8731 C210.6674,114.1691 209.4944,117.7801 206.6904,119.8171 L105.0614,193.6551 L197.8544,74.7341 L197.8544,74.7341 Z" id="Fill-20" fill="#FCA326" class="tanuki-shape"></path>
|
|
||||||
<path d="M197.8544,74.7342 L143.7014,74.7342 L166.9744,3.1092 C168.1714,-0.5768 173.3854,-0.5758 174.5824,3.1092 L197.8544,74.7342 L197.8544,74.7342 Z" id="Fill-22" fill="#E24329" class="tanuki-shape"></path>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 6.9 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 130 KiB |
|
@ -0,0 +1,201 @@
|
||||||
|
<script>
|
||||||
|
import {
|
||||||
|
GlButton,
|
||||||
|
GlModalDirective,
|
||||||
|
GlTooltip,
|
||||||
|
GlModal,
|
||||||
|
GlFormGroup,
|
||||||
|
GlFormInput,
|
||||||
|
GlSprintf,
|
||||||
|
} from '@gitlab/ui';
|
||||||
|
import { s__, __, sprintf } from '~/locale';
|
||||||
|
import { REVOKE_TOKEN_MODAL_ID, TOKEN_STATUS_ACTIVE } from '../constants';
|
||||||
|
import revokeAgentToken from '../graphql/mutations/revoke_token.mutation.graphql';
|
||||||
|
import getClusterAgentQuery from '../graphql/queries/get_cluster_agent.query.graphql';
|
||||||
|
import { removeTokenFromStore } from '../graphql/cache_update';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
GlButton,
|
||||||
|
GlTooltip,
|
||||||
|
GlModal,
|
||||||
|
GlFormGroup,
|
||||||
|
GlFormInput,
|
||||||
|
GlSprintf,
|
||||||
|
},
|
||||||
|
directives: {
|
||||||
|
GlModalDirective,
|
||||||
|
},
|
||||||
|
inject: ['agentName', 'projectPath', 'canAdminCluster'],
|
||||||
|
props: {
|
||||||
|
token: {
|
||||||
|
required: true,
|
||||||
|
type: Object,
|
||||||
|
validator: (value) => ['id', 'name'].every((prop) => value[prop]),
|
||||||
|
},
|
||||||
|
cursor: {
|
||||||
|
required: true,
|
||||||
|
type: Object,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
i18n: {
|
||||||
|
revokeButton: s__('ClusterAgents|Revoke token'),
|
||||||
|
dropdownDisabledHint: s__(
|
||||||
|
'ClusterAgents|Requires a Maintainer or greater role to perform this action',
|
||||||
|
),
|
||||||
|
modalTitle: s__('ClusterAgents|Revoke access token?'),
|
||||||
|
modalBody: s__(
|
||||||
|
'ClusterAgents|Are you sure you want to revoke this token? You cannot undo this action.',
|
||||||
|
),
|
||||||
|
modalInputLabel: s__('ClusterAgents|To revoke the token, type %{name} to confirm:'),
|
||||||
|
modalCancel: __('Cancel'),
|
||||||
|
successMessage: s__('ClusterAgents|%{name} successfully revoked'),
|
||||||
|
defaultError: __('An error occurred. Please try again.'),
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
loading: false,
|
||||||
|
error: null,
|
||||||
|
revokeConfirmText: null,
|
||||||
|
tokenName: null,
|
||||||
|
variables: {
|
||||||
|
agentName: this.agentName,
|
||||||
|
projectPath: this.projectPath,
|
||||||
|
tokenStatus: TOKEN_STATUS_ACTIVE,
|
||||||
|
...this.cursor,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
revokeBtnDisabled() {
|
||||||
|
return this.loading || !this.canAdminCluster;
|
||||||
|
},
|
||||||
|
modalId() {
|
||||||
|
return sprintf(REVOKE_TOKEN_MODAL_ID, {
|
||||||
|
tokenName: this.token.name,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
primaryModalProps() {
|
||||||
|
return {
|
||||||
|
text: this.$options.i18n.revokeButton,
|
||||||
|
attributes: [
|
||||||
|
{ disabled: this.loading || this.disableModalSubmit, loading: this.loading },
|
||||||
|
{ variant: 'danger' },
|
||||||
|
],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
cancelModalProps() {
|
||||||
|
return {
|
||||||
|
text: this.$options.i18n.modalCancel,
|
||||||
|
attributes: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
disableModalSubmit() {
|
||||||
|
return this.revokeConfirmText !== this.token.name;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async revokeToken() {
|
||||||
|
if (this.disableModalSubmit || this.loading) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.loading = true;
|
||||||
|
this.error = null;
|
||||||
|
this.tokenName = this.token.name;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { errors } = await this.revokeTokenMutation();
|
||||||
|
|
||||||
|
if (errors.length) {
|
||||||
|
throw new Error(errors[0]);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.error = error?.message || this.$options.i18n.defaultError;
|
||||||
|
} finally {
|
||||||
|
this.loading = false;
|
||||||
|
const successMessage = sprintf(this.$options.i18n.successMessage, {
|
||||||
|
name: this.tokenName,
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$toast.show(this.error || successMessage);
|
||||||
|
|
||||||
|
this.hideModal();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
revokeTokenMutation() {
|
||||||
|
return this.$apollo
|
||||||
|
.mutate({
|
||||||
|
mutation: revokeAgentToken,
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
id: this.token.id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
update: (store) => {
|
||||||
|
removeTokenFromStore(store, this.token, getClusterAgentQuery, this.variables);
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
.then(({ data: { clusterAgentTokenRevoke } }) => {
|
||||||
|
return clusterAgentTokenRevoke;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
resetModal() {
|
||||||
|
this.loading = false;
|
||||||
|
this.error = null;
|
||||||
|
this.revokeConfirmText = null;
|
||||||
|
},
|
||||||
|
hideModal() {
|
||||||
|
this.resetModal();
|
||||||
|
this.$refs.modal.hide();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div ref="revokeToken" class="gl-display-inline-block">
|
||||||
|
<gl-button
|
||||||
|
v-gl-modal-directive="modalId"
|
||||||
|
icon="remove"
|
||||||
|
category="secondary"
|
||||||
|
variant="danger"
|
||||||
|
:disabled="revokeBtnDisabled"
|
||||||
|
:title="$options.i18n.revokeButton"
|
||||||
|
:aria-label="$options.i18n.revokeButton"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<gl-tooltip
|
||||||
|
v-if="!canAdminCluster"
|
||||||
|
:target="() => $refs.revokeToken"
|
||||||
|
:title="$options.i18n.dropdownDisabledHint"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<gl-modal
|
||||||
|
ref="modal"
|
||||||
|
:modal-id="modalId"
|
||||||
|
:title="$options.i18n.modalTitle"
|
||||||
|
:action-primary="primaryModalProps"
|
||||||
|
:action-cancel="cancelModalProps"
|
||||||
|
size="sm"
|
||||||
|
@primary="revokeToken"
|
||||||
|
@hide="hideModal"
|
||||||
|
>
|
||||||
|
<p>{{ $options.i18n.modalBody }}</p>
|
||||||
|
|
||||||
|
<gl-form-group>
|
||||||
|
<template #label>
|
||||||
|
<gl-sprintf :message="$options.i18n.modalInputLabel">
|
||||||
|
<template #name>
|
||||||
|
<code>{{ token.name }}</code>
|
||||||
|
</template>
|
||||||
|
</gl-sprintf>
|
||||||
|
</template>
|
||||||
|
<gl-form-input v-model="revokeConfirmText" @keydown.enter="revokeToken" />
|
||||||
|
</gl-form-group>
|
||||||
|
</gl-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
|
@ -3,6 +3,7 @@ import { GlEmptyState, GlTable, GlTooltip, GlTruncate } from '@gitlab/ui';
|
||||||
import { s__ } from '~/locale';
|
import { s__ } from '~/locale';
|
||||||
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
|
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
|
||||||
import CreateTokenButton from './create_token_button.vue';
|
import CreateTokenButton from './create_token_button.vue';
|
||||||
|
import RevokeTokenButton from './revoke_token_button.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -12,6 +13,7 @@ export default {
|
||||||
GlTruncate,
|
GlTruncate,
|
||||||
TimeAgoTooltip,
|
TimeAgoTooltip,
|
||||||
CreateTokenButton,
|
CreateTokenButton,
|
||||||
|
RevokeTokenButton,
|
||||||
},
|
},
|
||||||
i18n: {
|
i18n: {
|
||||||
createdBy: s__('ClusterAgents|Created by'),
|
createdBy: s__('ClusterAgents|Created by'),
|
||||||
|
@ -66,6 +68,11 @@ export default {
|
||||||
label: this.$options.i18n.description,
|
label: this.$options.i18n.description,
|
||||||
tdAttr: { 'data-testid': 'agent-token-description' },
|
tdAttr: { 'data-testid': 'agent-token-description' },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'actions',
|
||||||
|
label: '',
|
||||||
|
tdAttr: { 'data-testid': 'agent-token-revoke' },
|
||||||
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -119,6 +126,10 @@ export default {
|
||||||
</gl-tooltip>
|
</gl-tooltip>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template #cell(actions)="{ item }">
|
||||||
|
<revoke-token-button :token="item" :cluster-agent-id="clusterAgentId" :cursor="cursor" />
|
||||||
|
</template>
|
||||||
</gl-table>
|
</gl-table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -44,3 +44,5 @@ export const EVENT_ACTIONS_OPEN = 'open_modal';
|
||||||
export const EVENT_ACTIONS_CLICK = 'click_button';
|
export const EVENT_ACTIONS_CLICK = 'click_button';
|
||||||
|
|
||||||
export const TOKEN_NAME_LIMIT = 255;
|
export const TOKEN_NAME_LIMIT = 255;
|
||||||
|
|
||||||
|
export const REVOKE_TOKEN_MODAL_ID = 'revoke-token-%{tokenName}';
|
||||||
|
|
|
@ -22,3 +22,25 @@ export function addAgentTokenToStore(store, clusterAgentTokenCreate, query, vari
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function removeTokenFromStore(store, revokeToken, query, variables) {
|
||||||
|
if (!hasErrors(revokeToken)) {
|
||||||
|
const sourceData = store.readQuery({
|
||||||
|
query,
|
||||||
|
variables,
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = produce(sourceData, (draftData) => {
|
||||||
|
draftData.project.clusterAgent.tokens.nodes = draftData.project.clusterAgent.tokens.nodes.filter(
|
||||||
|
({ id }) => id !== revokeToken.id,
|
||||||
|
);
|
||||||
|
draftData.project.clusterAgent.tokens.count -= 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
store.writeQuery({
|
||||||
|
query,
|
||||||
|
variables,
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
mutation revokeAgentToken($input: ClusterAgentTokenRevokeInput!) {
|
||||||
|
clusterAgentTokenRevoke(input: $input) {
|
||||||
|
errors
|
||||||
|
}
|
||||||
|
}
|
|
@ -79,7 +79,7 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="mr-version-controls border-top">
|
<div class="mr-version-controls">
|
||||||
<div class="mr-version-menus-container content-block">
|
<div class="mr-version-menus-container content-block">
|
||||||
<gl-button
|
<gl-button
|
||||||
v-if="hasChanges"
|
v-if="hasChanges"
|
||||||
|
|
|
@ -37,6 +37,7 @@ export const initSecurityConfiguration = (el) => {
|
||||||
return new Vue({
|
return new Vue({
|
||||||
el,
|
el,
|
||||||
apolloProvider,
|
apolloProvider,
|
||||||
|
name: 'SecurityConfigurationRoot',
|
||||||
provide: {
|
provide: {
|
||||||
projectFullPath,
|
projectFullPath,
|
||||||
upgradePath,
|
upgradePath,
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
@media (min-width: map-get($grid-breakpoints, md)) {
|
@media (min-width: map-get($grid-breakpoints, md)) {
|
||||||
// The `+11` is to ensure the file header border shows when scrolled -
|
// The `+11` is to ensure the file header border shows when scrolled -
|
||||||
// the bottom of the compare-versions header and the top of the file header
|
// the bottom of the compare-versions header and the top of the file header
|
||||||
$mr-file-header-top: calc(#{$mr-version-controls-height} + #{$header-height} + #{$mr-tabs-height} + 11px);
|
$mr-file-header-top: calc(#{$header-height} + #{$mr-tabs-height});
|
||||||
|
|
||||||
position: -webkit-sticky;
|
position: -webkit-sticky;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
|
|
|
@ -10,17 +10,6 @@
|
||||||
right: 0;
|
right: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
|
|
||||||
.logo-text {
|
|
||||||
line-height: initial;
|
|
||||||
|
|
||||||
svg {
|
|
||||||
width: 55px;
|
|
||||||
height: 14px;
|
|
||||||
margin: 0;
|
|
||||||
fill: $white;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.close-icon {
|
.close-icon {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -71,7 +60,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
margin: 5px 2px 5px -12px;
|
margin: 4px 2px 4px -12px;
|
||||||
border-radius: $border-radius-default;
|
border-radius: $border-radius-default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,19 +9,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.tanuki-logo {
|
.tanuki-logo {
|
||||||
.tanuki-left-ear,
|
.tanuki {
|
||||||
.tanuki-right-ear,
|
|
||||||
.tanuki-nose {
|
|
||||||
@include tanuki-logo-colors($tanuki-red);
|
@include tanuki-logo-colors($tanuki-red);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tanuki-left-eye,
|
.left-cheek,
|
||||||
.tanuki-right-eye {
|
.right-cheek {
|
||||||
@include tanuki-logo-colors($tanuki-orange);
|
@include tanuki-logo-colors($tanuki-orange);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tanuki-left-cheek,
|
.chin {
|
||||||
.tanuki-right-cheek {
|
|
||||||
@include tanuki-logo-colors($tanuki-yellow);
|
@include tanuki-logo-colors($tanuki-yellow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,100 +28,56 @@
|
||||||
@include webkit-prefix(animation-iteration-count, infinite);
|
@include webkit-prefix(animation-iteration-count, infinite);
|
||||||
}
|
}
|
||||||
|
|
||||||
.tanuki-left-cheek {
|
.tanuki {
|
||||||
@include include-keyframes(animate-tanuki-left-cheek) {
|
@include include-keyframes(animate-tanuki-base) {
|
||||||
0%,
|
0%,
|
||||||
10%,
|
50% {
|
||||||
100% {
|
|
||||||
fill: lighten($tanuki-yellow, 25%);
|
|
||||||
}
|
|
||||||
|
|
||||||
90% {
|
|
||||||
fill: $tanuki-yellow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tanuki-left-eye {
|
|
||||||
@include include-keyframes(animate-tanuki-left-eye) {
|
|
||||||
10%,
|
|
||||||
80% {
|
|
||||||
fill: $tanuki-orange;
|
|
||||||
}
|
|
||||||
|
|
||||||
20%,
|
|
||||||
90% {
|
|
||||||
fill: lighten($tanuki-orange, 25%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tanuki-left-ear {
|
|
||||||
@include include-keyframes(animate-tanuki-left-ear) {
|
|
||||||
10%,
|
|
||||||
80% {
|
|
||||||
fill: $tanuki-red;
|
fill: $tanuki-red;
|
||||||
}
|
}
|
||||||
|
|
||||||
20%,
|
25% {
|
||||||
90% {
|
|
||||||
fill: lighten($tanuki-red, 25%);
|
fill: lighten($tanuki-red, 25%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.tanuki-nose {
|
.right-cheek {
|
||||||
@include include-keyframes(animate-tanuki-nose) {
|
|
||||||
20%,
|
|
||||||
70% {
|
|
||||||
fill: $tanuki-red;
|
|
||||||
}
|
|
||||||
|
|
||||||
30%,
|
|
||||||
80% {
|
|
||||||
fill: lighten($tanuki-red, 25%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tanuki-right-eye {
|
|
||||||
@include include-keyframes(animate-tanuki-right-eye) {
|
|
||||||
30%,
|
|
||||||
60% {
|
|
||||||
fill: $tanuki-orange;
|
|
||||||
}
|
|
||||||
|
|
||||||
40%,
|
|
||||||
70% {
|
|
||||||
fill: lighten($tanuki-orange, 25%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tanuki-right-ear {
|
|
||||||
@include include-keyframes(animate-tanuki-right-ear) {
|
|
||||||
30%,
|
|
||||||
60% {
|
|
||||||
fill: $tanuki-red;
|
|
||||||
}
|
|
||||||
|
|
||||||
40%,
|
|
||||||
70% {
|
|
||||||
fill: lighten($tanuki-red, 25%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.tanuki-right-cheek {
|
|
||||||
@include include-keyframes(animate-tanuki-right-cheek) {
|
@include include-keyframes(animate-tanuki-right-cheek) {
|
||||||
40% {
|
25%,
|
||||||
|
75% {
|
||||||
|
fill: $tanuki-orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
fill: lighten($tanuki-orange, 25%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.chin {
|
||||||
|
@include include-keyframes(animate-tanuki-chin) {
|
||||||
|
50%,
|
||||||
|
100% {
|
||||||
fill: $tanuki-yellow;
|
fill: $tanuki-yellow;
|
||||||
}
|
}
|
||||||
|
|
||||||
60% {
|
75% {
|
||||||
fill: lighten($tanuki-yellow, 25%);
|
fill: lighten($tanuki-yellow, 25%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.left-cheek {
|
||||||
|
@include include-keyframes(animate-tanuki-left-cheek) {
|
||||||
|
25%,
|
||||||
|
75% {
|
||||||
|
fill: $tanuki-orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
fill: lighten($tanuki-orange, 25%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -933,7 +933,6 @@ $issues-analytics-popover-boarder-color: rgba(0, 0, 0, 0.15);
|
||||||
Merge requests
|
Merge requests
|
||||||
*/
|
*/
|
||||||
$mr-tabs-height: 48px;
|
$mr-tabs-height: 48px;
|
||||||
$mr-version-controls-height: 56px;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compare Branches
|
Compare Branches
|
||||||
|
|
|
@ -197,6 +197,5 @@ tr.footer td {
|
||||||
|
|
||||||
.footer-logo {
|
.footer-logo {
|
||||||
width: 90px;
|
width: 90px;
|
||||||
height: 33px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ $tabs-holder-z-index: 250;
|
||||||
// If they don't match, the file tree and the diff files stick
|
// If they don't match, the file tree and the diff files stick
|
||||||
// to the top at different heights, which is a bad-looking defect
|
// to the top at different heights, which is a bad-looking defect
|
||||||
$diff-file-header-top: 11px;
|
$diff-file-header-top: 11px;
|
||||||
$top-pos: calc(#{$header-height} + #{$mr-tabs-height} + #{$mr-version-controls-height} + #{$diff-file-header-top});
|
$top-pos: calc(#{$header-height} + #{$mr-tabs-height} + #{$diff-file-header-top});
|
||||||
|
|
||||||
position: -webkit-sticky;
|
position: -webkit-sticky;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
|
@ -677,11 +677,8 @@ $tabs-holder-z-index: 250;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mr-version-controls {
|
.mr-version-controls {
|
||||||
position: relative;
|
|
||||||
z-index: $tabs-holder-z-index + 10;
|
|
||||||
background: var(--white, $white);
|
background: var(--white, $white);
|
||||||
color: var(--gl-text-color, $gl-text-color);
|
color: var(--gl-text-color, $gl-text-color);
|
||||||
margin-top: -1px;
|
|
||||||
|
|
||||||
.mr-version-menus-container {
|
.mr-version-menus-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -703,7 +700,7 @@ $tabs-holder-z-index: 250;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-block {
|
.content-block {
|
||||||
padding: $gl-padding;
|
padding: $gl-padding-8 $gl-padding;
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,28 +718,6 @@ $tabs-holder-z-index: 250;
|
||||||
.btn {
|
.btn {
|
||||||
height: 34px;
|
height: 34px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@include media-breakpoint-up(md) {
|
|
||||||
position: -webkit-sticky;
|
|
||||||
position: sticky;
|
|
||||||
top: calc(#{$header-height} + #{$mr-tabs-height});
|
|
||||||
|
|
||||||
.with-system-header & {
|
|
||||||
top: calc(#{$header-height} + #{$mr-tabs-height} + #{$system-header-height});
|
|
||||||
}
|
|
||||||
|
|
||||||
.with-system-header.with-performance-bar & {
|
|
||||||
top: calc(#{$header-height} + #{$mr-tabs-height} + #{$system-header-height} + #{$performance-bar-height});
|
|
||||||
}
|
|
||||||
|
|
||||||
.mr-version-menus-container {
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.with-performance-bar & {
|
|
||||||
top: calc(#{$header-height} + #{$performance-bar-height} + #{$mr-tabs-height});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.mr-section-container .resize-observer > object {
|
.mr-section-container .resize-observer > object {
|
||||||
|
|
|
@ -22,14 +22,6 @@
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
line-height: $line-height-base;
|
line-height: $line-height-base;
|
||||||
|
|
||||||
.logo-text {
|
|
||||||
width: 55px;
|
|
||||||
height: 24px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-collapse {
|
.navbar-collapse {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
flex-grow: 0;
|
flex-grow: 0;
|
||||||
|
|
|
@ -210,16 +210,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cross-project-reference {
|
|
||||||
span {
|
|
||||||
width: 85%;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
padding: 1px 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.selectbox {
|
.selectbox {
|
||||||
display: none;
|
display: none;
|
||||||
|
|
||||||
|
|
|
@ -771,15 +771,6 @@ input {
|
||||||
right: 0;
|
right: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
.navbar-gitlab .logo-text {
|
|
||||||
line-height: initial;
|
|
||||||
}
|
|
||||||
.navbar-gitlab .logo-text svg {
|
|
||||||
width: 55px;
|
|
||||||
height: 14px;
|
|
||||||
margin: 0;
|
|
||||||
fill: #333;
|
|
||||||
}
|
|
||||||
.navbar-gitlab .close-icon {
|
.navbar-gitlab .close-icon {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -818,7 +809,7 @@ input {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
margin: 5px 2px 5px -12px;
|
margin: 4px 2px 4px -12px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
|
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
|
||||||
|
@ -998,6 +989,16 @@ input {
|
||||||
.top-nav-toggle .dropdown-icon {
|
.top-nav-toggle .dropdown-icon {
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.tanuki-logo .tanuki {
|
||||||
|
fill: #e24329;
|
||||||
|
}
|
||||||
|
.tanuki-logo .left-cheek,
|
||||||
|
.tanuki-logo .right-cheek {
|
||||||
|
fill: #fc6d26;
|
||||||
|
}
|
||||||
|
.tanuki-logo .chin {
|
||||||
|
fill: #fca326;
|
||||||
|
}
|
||||||
.context-header {
|
.context-header {
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
@ -1902,9 +1903,6 @@ body.gl-dark .nav-sidebar .fly-out-top-item .fly-out-top-item-container {
|
||||||
background-color: var(--gray-100, #303030);
|
background-color: var(--gray-100, #303030);
|
||||||
color: var(--gray-900, #fafafa);
|
color: var(--gray-900, #fafafa);
|
||||||
}
|
}
|
||||||
body.gl-dark .logo-text svg {
|
|
||||||
fill: var(--gl-text-color);
|
|
||||||
}
|
|
||||||
body.gl-dark .navbar-gitlab {
|
body.gl-dark .navbar-gitlab {
|
||||||
background-color: var(--gray-50);
|
background-color: var(--gray-50);
|
||||||
box-shadow: 0 1px 0 0 var(--gray-100);
|
box-shadow: 0 1px 0 0 var(--gray-100);
|
||||||
|
@ -2048,6 +2046,19 @@ body.gl-dark {
|
||||||
.gl-display-none {
|
.gl-display-none {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.gl-lg-display-none\! {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.gl-display-flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.gl-lg-display-flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
@media (min-width: 576px) {
|
@media (min-width: 576px) {
|
||||||
.gl-sm-display-block {
|
.gl-sm-display-block {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
|
@ -756,15 +756,6 @@ input {
|
||||||
right: 0;
|
right: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
.navbar-gitlab .logo-text {
|
|
||||||
line-height: initial;
|
|
||||||
}
|
|
||||||
.navbar-gitlab .logo-text svg {
|
|
||||||
width: 55px;
|
|
||||||
height: 14px;
|
|
||||||
margin: 0;
|
|
||||||
fill: #fff;
|
|
||||||
}
|
|
||||||
.navbar-gitlab .close-icon {
|
.navbar-gitlab .close-icon {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@ -803,7 +794,7 @@ input {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 2px 8px;
|
padding: 2px 8px;
|
||||||
margin: 5px 2px 5px -12px;
|
margin: 4px 2px 4px -12px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
|
.navbar-gitlab .header-content .navbar-collapse > ul.nav > li:not(.d-none) {
|
||||||
|
@ -983,6 +974,16 @@ input {
|
||||||
.top-nav-toggle .dropdown-icon {
|
.top-nav-toggle .dropdown-icon {
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.tanuki-logo .tanuki {
|
||||||
|
fill: #e24329;
|
||||||
|
}
|
||||||
|
.tanuki-logo .left-cheek,
|
||||||
|
.tanuki-logo .right-cheek {
|
||||||
|
fill: #fc6d26;
|
||||||
|
}
|
||||||
|
.tanuki-logo .chin {
|
||||||
|
fill: #fca326;
|
||||||
|
}
|
||||||
.context-header {
|
.context-header {
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
@ -1706,6 +1707,19 @@ svg.s16 {
|
||||||
.gl-display-none {
|
.gl-display-none {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.gl-lg-display-none\! {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.gl-display-flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.gl-lg-display-flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
}
|
||||||
@media (min-width: 576px) {
|
@media (min-width: 576px) {
|
||||||
.gl-sm-display-block {
|
.gl-sm-display-block {
|
||||||
display: block;
|
display: block;
|
||||||
|
|
|
@ -519,6 +519,16 @@ label.label-bold {
|
||||||
.navbar-empty .brand-header-logo {
|
.navbar-empty .brand-header-logo {
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
}
|
}
|
||||||
|
.tanuki-logo .tanuki {
|
||||||
|
fill: #e24329;
|
||||||
|
}
|
||||||
|
.tanuki-logo .left-cheek,
|
||||||
|
.tanuki-logo .right-cheek {
|
||||||
|
fill: #fc6d26;
|
||||||
|
}
|
||||||
|
.tanuki-logo .chin {
|
||||||
|
fill: #fca326;
|
||||||
|
}
|
||||||
input::-moz-placeholder {
|
input::-moz-placeholder {
|
||||||
color: #868686;
|
color: #868686;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
|
@ -71,10 +71,13 @@
|
||||||
body.gl-dark {
|
body.gl-dark {
|
||||||
@include gitlab-theme($gray-900, $gray-400, $gray-500, $gray-900, $gray-900, $white);
|
@include gitlab-theme($gray-900, $gray-400, $gray-500, $gray-900, $gray-900, $white);
|
||||||
|
|
||||||
.logo-text svg {
|
.terms {
|
||||||
fill: var(--gl-text-color);
|
.logo-text {
|
||||||
|
fill: var(--black);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.navbar-gitlab {
|
.navbar-gitlab {
|
||||||
background-color: var(--gray-50);
|
background-color: var(--gray-50);
|
||||||
box-shadow: 0 1px 0 0 var(--gray-100);
|
box-shadow: 0 1px 0 0 var(--gray-100);
|
||||||
|
|
|
@ -15,8 +15,8 @@ body {
|
||||||
background-color: $gray-50;
|
background-color: $gray-50;
|
||||||
box-shadow: 0 1px 0 0 $border-color;
|
box-shadow: 0 1px 0 0 $border-color;
|
||||||
|
|
||||||
.logo-text svg {
|
.logo-text {
|
||||||
fill: $gray-900;
|
fill: #171321;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar-sub-nav,
|
.navbar-sub-nav,
|
||||||
|
|
|
@ -27,6 +27,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
|
||||||
|
|
||||||
feature_category :source_code_management, [:repository, :clear_repository_check_states]
|
feature_category :source_code_management, [:repository, :clear_repository_check_states]
|
||||||
feature_category :continuous_integration, [:ci_cd, :reset_registration_token]
|
feature_category :continuous_integration, [:ci_cd, :reset_registration_token]
|
||||||
|
urgency :low, [:ci_cd, :reset_registration_token]
|
||||||
feature_category :service_ping, [:usage_data, :service_usage_data]
|
feature_category :service_ping, [:usage_data, :service_usage_data]
|
||||||
feature_category :integrations, [:integrations]
|
feature_category :integrations, [:integrations]
|
||||||
feature_category :pages, [:lets_encrypt_terms_of_service]
|
feature_category :pages, [:lets_encrypt_terms_of_service]
|
||||||
|
|
|
@ -4,6 +4,7 @@ class Admin::JobsController < Admin::ApplicationController
|
||||||
BUILDS_PER_PAGE = 30
|
BUILDS_PER_PAGE = 30
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def index
|
def index
|
||||||
# We need all builds for tabs counters
|
# We need all builds for tabs counters
|
||||||
|
|
|
@ -11,6 +11,7 @@ module Groups
|
||||||
before_action :push_licensed_features, only: [:show]
|
before_action :push_licensed_features, only: [:show]
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def show
|
def show
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,7 @@ class Projects::GraphsController < Projects::ApplicationController
|
||||||
urgency :low, [:show]
|
urgency :low, [:show]
|
||||||
|
|
||||||
feature_category :continuous_integration, [:ci]
|
feature_category :continuous_integration, [:ci]
|
||||||
|
urgency :low, [:ci]
|
||||||
|
|
||||||
def show
|
def show
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
|
|
@ -28,6 +28,7 @@ class Projects::JobsController < Projects::ApplicationController
|
||||||
layout 'project'
|
layout 'project'
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def index
|
def index
|
||||||
# We need all builds for tabs counters
|
# We need all builds for tabs counters
|
||||||
|
|
|
@ -88,6 +88,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
|
||||||
:codequality_mr_diff_reports,
|
:codequality_mr_diff_reports,
|
||||||
:codequality_reports
|
:codequality_reports
|
||||||
]
|
]
|
||||||
|
urgency :low, [:pipeline_status, :pipelines, :exposed_artifacts]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@merge_requests = @issuables
|
@merge_requests = @issuables
|
||||||
|
|
|
@ -11,6 +11,7 @@ class Projects::PipelineSchedulesController < Projects::ApplicationController
|
||||||
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
|
before_action :authorize_admin_pipeline_schedule!, only: [:destroy]
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
# rubocop: disable CodeReuse/ActiveRecord
|
# rubocop: disable CodeReuse/ActiveRecord
|
||||||
def index
|
def index
|
||||||
|
|
|
@ -11,6 +11,7 @@ module Projects
|
||||||
before_action :authorize_read_pipeline!
|
before_action :authorize_read_pipeline!
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,11 @@ class Projects::PipelinesController < Projects::ApplicationController
|
||||||
include RedisTracking
|
include RedisTracking
|
||||||
|
|
||||||
urgency :default, [:status]
|
urgency :default, [:status]
|
||||||
urgency :low, [:index, :new, :builds, :show, :failures, :create, :stage, :retry, :dag, :cancel, :test_report]
|
urgency :low, [
|
||||||
|
:index, :new, :builds, :show, :failures, :create,
|
||||||
|
:stage, :retry, :dag, :cancel, :test_report,
|
||||||
|
:charts, :config_variables, :destroy
|
||||||
|
]
|
||||||
|
|
||||||
before_action :disable_query_limiting, only: [:create, :retry]
|
before_action :disable_query_limiting, only: [:create, :retry]
|
||||||
before_action :pipeline, except: [:index, :new, :create, :charts, :config_variables]
|
before_action :pipeline, except: [:index, :new, :create, :charts, :config_variables]
|
||||||
|
|
|
@ -4,6 +4,7 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController
|
||||||
before_action :authorize_admin_pipeline!
|
before_action :authorize_admin_pipeline!
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def show
|
def show
|
||||||
redirect_to project_settings_ci_cd_path(@project, params: params.to_unsafe_h)
|
redirect_to project_settings_ci_cd_path(@project, params: params.to_unsafe_h)
|
||||||
|
|
|
@ -18,6 +18,7 @@ module Projects
|
||||||
helper_method :highlight_badge
|
helper_method :highlight_badge
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def show
|
def show
|
||||||
if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project)
|
if Feature.enabled?(:ci_pipeline_triggers_settings_vue_ui, @project)
|
||||||
|
|
|
@ -9,6 +9,7 @@ class Projects::TriggersController < Projects::ApplicationController
|
||||||
layout 'project_settings'
|
layout 'project_settings'
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
def index
|
def index
|
||||||
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers')
|
redirect_to project_settings_ci_cd_path(@project, anchor: 'js-pipeline-triggers')
|
||||||
|
|
|
@ -35,23 +35,21 @@ module AppearancesHelper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def brand_header_logo
|
def brand_header_logo(options = {})
|
||||||
|
add_gitlab_white_text = options[:add_gitlab_white_text] || false
|
||||||
|
add_gitlab_black_text = options[:add_gitlab_black_text] || false
|
||||||
|
|
||||||
if current_appearance&.header_logo?
|
if current_appearance&.header_logo?
|
||||||
image_tag current_appearance.header_logo_path, class: 'brand-header-logo'
|
image_tag current_appearance.header_logo_path, class: 'brand-header-logo'
|
||||||
elsif Feature.enabled?(:ukraine_support_tanuki)
|
elsif add_gitlab_white_text
|
||||||
render partial: 'shared/logo_ukraine', formats: :svg
|
render partial: 'shared/logo_with_white_text', formats: :svg
|
||||||
|
elsif add_gitlab_black_text
|
||||||
|
render partial: 'shared/logo_with_black_text', formats: :svg
|
||||||
else
|
else
|
||||||
render partial: 'shared/logo', formats: :svg
|
render partial: 'shared/logo', formats: :svg
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Skip the 'GitLab' type logo when custom brand logo is set
|
|
||||||
def brand_header_logo_type
|
|
||||||
unless current_appearance&.header_logo?
|
|
||||||
render partial: 'shared/logo_type', formats: :svg
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def header_message
|
def header_message
|
||||||
return unless current_appearance&.show_header?
|
return unless current_appearance&.show_header?
|
||||||
|
|
||||||
|
|
|
@ -69,8 +69,8 @@ module EmailsHelper
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
image_tag(
|
image_tag(
|
||||||
image_url('mailers/gitlab_header_logo.gif'),
|
image_url('mailers/gitlab_logo.png'),
|
||||||
size: '55x50',
|
size: '55x55',
|
||||||
alt: 'GitLab'
|
alt: 'GitLab'
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -55,7 +55,7 @@ module PageLayoutHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def page_image
|
def page_image
|
||||||
default = image_url('gitlab_logo.png')
|
default = image_url('twitter_card.jpg')
|
||||||
|
|
||||||
subject = @project || @user || @group
|
subject = @project || @user || @group
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,9 @@ module StorageHelper
|
||||||
|
|
||||||
{
|
{
|
||||||
text: html_escape_once(s_("UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. " \
|
text: html_escape_once(s_("UsageQuota|From %{storage_enforcement_date} storage limits will apply to this namespace. " \
|
||||||
"View and manage your usage in %{strong_start}%{namespace_type} settings > Usage quotas%{strong_end}.")).html_safe %
|
"You are currently using %{used_storage} of namespace storage. " \
|
||||||
{ storage_enforcement_date: namespace.storage_enforcement_date, strong_start: "<strong>".html_safe, strong_end: "</strong>".html_safe, namespace_type: namespace.type },
|
"View and manage your usage from %{strong_start}%{namespace_type} settings > Usage quotas%{strong_end}.")).html_safe %
|
||||||
|
{ storage_enforcement_date: namespace.storage_enforcement_date, used_storage: storage_counter(namespace.root_storage_statistics&.storage_size || 0), strong_start: "<strong>".html_safe, strong_end: "</strong>".html_safe, namespace_type: namespace.type },
|
||||||
variant: 'warning',
|
variant: 'warning',
|
||||||
callouts_path: namespace.user_namespace? ? callouts_path : group_callouts_path,
|
callouts_path: namespace.user_namespace? ? callouts_path : group_callouts_path,
|
||||||
callouts_feature_name: storage_enforcement_banner_user_callouts_feature_name(namespace),
|
callouts_feature_name: storage_enforcement_banner_user_callouts_feature_name(namespace),
|
||||||
|
|
|
@ -8,13 +8,13 @@
|
||||||
= _("Register the runner with this URL:")
|
= _("Register the runner with this URL:")
|
||||||
%br
|
%br
|
||||||
%code#coordinator_address= root_url(only_path: false)
|
%code#coordinator_address= root_url(only_path: false)
|
||||||
= clipboard_button(target: '#coordinator_address', title: _("Copy URL"), class: "btn-transparent btn-clipboard")
|
= clipboard_button(target: '#coordinator_address', title: _("Copy URL"))
|
||||||
%br
|
%br
|
||||||
%br
|
%br
|
||||||
= _("And this registration token:")
|
= _("And this registration token:")
|
||||||
%br
|
%br
|
||||||
%code#registration_token{ data: {testid: 'registration_token' } }= registration_token
|
%code#registration_token{ data: {testid: 'registration_token' } }= registration_token
|
||||||
= clipboard_button(target: '#registration_token', title: _("Copy token"), class: "btn-transparent btn-clipboard")
|
= clipboard_button(target: '#registration_token', title: _("Copy token"))
|
||||||
|
|
||||||
.gl-mt-3.gl-mb-3
|
.gl-mt-3.gl-mb-3
|
||||||
= button_to _("Reset registration token"), reset_token_url,
|
= button_to _("Reset registration token"), reset_token_url,
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
= _('Copy this registration token.')
|
= _('Copy this registration token.')
|
||||||
%br
|
%br
|
||||||
%code#registration_token{ data: { testid: 'registration_token' } }= registration_token
|
%code#registration_token{ data: { testid: 'registration_token' } }= registration_token
|
||||||
= clipboard_button(target: '#registration_token', title: _('Copy token'), class: 'btn-transparent btn-clipboard')
|
= clipboard_button(target: '#registration_token', title: _('Copy token'))
|
||||||
%li
|
%li
|
||||||
= _('Choose the preferred Runner and populate the AWS CFT.')
|
= _('Choose the preferred Runner and populate the AWS CFT.')
|
||||||
= link_to _('Learn more.'), 'https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg', target: '_blank', rel: 'noopener noreferrer'
|
= link_to _('Learn more.'), 'https://gitlab.com/guided-explorations/aws/gitlab-runner-autoscaling-aws-asg', target: '_blank', rel: 'noopener noreferrer'
|
||||||
|
|
|
@ -17,8 +17,7 @@
|
||||||
- if can?(current_user, :read_group, @group)
|
- if can?(current_user, :read_group, @group)
|
||||||
%span.gl-display-inline-block.gl-vertical-align-middle
|
%span.gl-display-inline-block.gl-vertical-align-middle
|
||||||
= s_("GroupPage|Group ID: %{group_id}") % { group_id: @group.id }
|
= s_("GroupPage|Group ID: %{group_id}") % { group_id: @group.id }
|
||||||
- button_class = "btn gl-button btn-sm btn-tertiary btn-default-tertiary home-panel-metadata"
|
= clipboard_button(title: s_('GroupPage|Copy group ID'), text: @group.id)
|
||||||
= clipboard_button(title: s_('GroupPage|Copy group ID'), text: @group.id, class: button_class)
|
|
||||||
- if current_user
|
- if current_user
|
||||||
%span.gl-ml-3.gl-mb-3
|
%span.gl-ml-3.gl-mb-3
|
||||||
= render 'shared/members/access_request_links', source: @group
|
= render 'shared/members/access_request_links', source: @group
|
||||||
|
|
|
@ -76,19 +76,11 @@
|
||||||
= action_cable_meta_tag
|
= action_cable_meta_tag
|
||||||
|
|
||||||
-# Apple Safari/iOS home screen icons
|
-# Apple Safari/iOS home screen icons
|
||||||
= favicon_link_tag 'touch-icon-iphone.png', rel: 'apple-touch-icon'
|
= favicon_link_tag 'apple-touch-icon.png', rel: 'apple-touch-icon'
|
||||||
= favicon_link_tag 'touch-icon-ipad.png', rel: 'apple-touch-icon', sizes: '76x76'
|
|
||||||
= favicon_link_tag 'touch-icon-iphone-retina.png', rel: 'apple-touch-icon', sizes: '120x120'
|
|
||||||
= favicon_link_tag 'touch-icon-ipad-retina.png', rel: 'apple-touch-icon', sizes: '152x152'
|
|
||||||
%link{ rel: 'mask-icon', href: image_path('logo.svg'), color: 'rgb(226, 67, 41)' }
|
|
||||||
|
|
||||||
-# OpenSearch
|
-# OpenSearch
|
||||||
%link{ href: search_opensearch_path(format: :xml), rel: 'search', title: 'Search GitLab', type: 'application/opensearchdescription+xml' }
|
%link{ href: search_opensearch_path(format: :xml), rel: 'search', title: 'Search GitLab', type: 'application/opensearchdescription+xml' }
|
||||||
|
|
||||||
-# Windows 8 pinned site tile
|
|
||||||
%meta{ name: 'msapplication-TileImage', content: image_path('msapplication-tile.png') }
|
|
||||||
%meta{ name: 'msapplication-TileColor', content: '#30353E' }
|
|
||||||
|
|
||||||
= yield :meta_tags
|
= yield :meta_tags
|
||||||
|
|
||||||
= render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id')
|
= render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id')
|
||||||
|
|
|
@ -9,11 +9,10 @@
|
||||||
%h1.title
|
%h1.title
|
||||||
%span.gl-sr-only GitLab
|
%span.gl-sr-only GitLab
|
||||||
= link_to root_path, title: _('Dashboard'), id: 'logo', **tracking_attrs('main_navigation', 'click_gitlab_logo_link', 'navigation') do
|
= link_to root_path, title: _('Dashboard'), id: 'logo', **tracking_attrs('main_navigation', 'click_gitlab_logo_link', 'navigation') do
|
||||||
= brand_header_logo
|
%span{ :class => "gl-display-none gl-lg-display-flex" }
|
||||||
- logo_text = brand_header_logo_type
|
= brand_header_logo({add_gitlab_white_text: true})
|
||||||
- if logo_text.present?
|
%span{ :class => "gl-lg-display-none! gl-display-flex" }
|
||||||
%span.logo-text.d-none.d-lg-block.gl-ml-3
|
= brand_header_logo
|
||||||
= logo_text
|
|
||||||
- if Gitlab.com_and_canary?
|
- if Gitlab.com_and_canary?
|
||||||
= link_to Gitlab::Saas.canary_toggle_com_url, class: 'canary-badge bg-transparent', data: { qa_selector: 'canary_badge_link' }, target: :_blank, rel: 'noopener noreferrer' do
|
= link_to Gitlab::Saas.canary_toggle_com_url, class: 'canary-badge bg-transparent', data: { qa_selector: 'canary_badge_link' }, target: :_blank, rel: 'noopener noreferrer' do
|
||||||
= gl_badge_tag({ variant: :success, size: :sm }) do
|
= gl_badge_tag({ variant: :success, size: :sm }) do
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
%header.navbar.fixed-top.navbar-gitlab.justify-content-center
|
%header.navbar.fixed-top.navbar-gitlab.justify-content-center
|
||||||
= render partial: 'shared/logo', formats: :svg
|
.gl-display-none.gl-lg-display-block
|
||||||
%span.logo-text.d-none.d-lg-block.gl-ml-3.pt-1
|
= render partial: 'shared/logo_with_white_text', formats: :svg
|
||||||
= render partial: 'shared/logo_type', formats: :svg
|
.gl-lg-display-none
|
||||||
|
= render partial: 'shared/logo', formats: :svg
|
||||||
|
|
|
@ -170,7 +170,7 @@
|
||||||
%table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", width: "100%" }
|
%table{ border: "0", cellpadding: "0", cellspacing: "0", role: "presentation", width: "100%" }
|
||||||
%tr
|
%tr
|
||||||
%td{ align: "left", style: "padding: 0 20px;" }
|
%td{ align: "left", style: "padding: 0 20px;" }
|
||||||
= about_link('mailers/in_product_marketing/gitlab-logo-gray-rgb.png', 200)
|
= about_link('mailers/gitlab_logo_black_text.png', 200)
|
||||||
%tr
|
%tr
|
||||||
%td{ "aria-hidden" => "true", height: "30", style: "font-size: 0; line-height: 0;" }
|
%td{ "aria-hidden" => "true", height: "30", style: "font-size: 0; line-height: 0;" }
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
= content_for :footer do
|
= content_for :footer do
|
||||||
%tr.footer
|
%tr.footer
|
||||||
%td
|
%td
|
||||||
%img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_footer_logo.gif') }
|
%img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png') }
|
||||||
%div
|
%div
|
||||||
- manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, class: 'mng-notif-link')
|
- manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, class: 'mng-notif-link')
|
||||||
- help_link = link_to(_("Help"), help_url, class: 'help-link')
|
- help_link = link_to(_("Help"), help_url, class: 'help-link')
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
!!! 5
|
!!! 5
|
||||||
- add_page_specific_style 'page_bundles/terms'
|
- add_page_specific_style 'page_bundles/terms'
|
||||||
- @hide_breadcrumbs = true
|
- @hide_breadcrumbs = true
|
||||||
|
- body_classes = [user_application_theme]
|
||||||
%html{ lang: I18n.locale, class: page_class }
|
%html{ lang: I18n.locale, class: page_class }
|
||||||
= render "layouts/head"
|
= render "layouts/head"
|
||||||
|
|
||||||
%body{ data: { page: body_data_page } }
|
%body{ class: body_classes, data: { page: body_data_page } }
|
||||||
.layout-page.terms{ class: page_class }
|
.layout-page.terms{ class: page_class }
|
||||||
.content-wrapper.gl-pb-5
|
.content-wrapper.gl-pb-5
|
||||||
.mobile-overlay
|
.mobile-overlay
|
||||||
|
@ -17,11 +18,7 @@
|
||||||
.content{ id: "content-body" }
|
.content{ id: "content-body" }
|
||||||
.gl-card
|
.gl-card
|
||||||
.gl-card-header
|
.gl-card-header
|
||||||
= brand_header_logo
|
= brand_header_logo({add_gitlab_black_text: true})
|
||||||
- logo_text = brand_header_logo_type
|
|
||||||
- if logo_text.present?
|
|
||||||
%span.logo-text.gl-ml-3
|
|
||||||
= logo_text
|
|
||||||
- if header_link?(:user_dropdown)
|
- if header_link?(:user_dropdown)
|
||||||
.navbar-collapse
|
.navbar-collapse
|
||||||
%ul.nav.navbar-nav
|
%ul.nav.navbar-nav
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
= content_for :footer do
|
= content_for :footer do
|
||||||
%tr.footer
|
%tr.footer
|
||||||
%td.gitlab-info
|
%td.gitlab-info
|
||||||
%img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_footer_logo.gif') }
|
%img.footer-logo{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png') }
|
||||||
%p.gitlab-info-text
|
%p.gitlab-info-text
|
||||||
= html_escape(_("GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate")) % { br_tag: '<br/>'.html_safe }
|
= html_escape(_("GitLab is a complete DevOps platform, delivered as a single application, fundamentally changing the way%{br_tag}Development, Security, and Ops teams collaborate")) % { br_tag: '<br/>'.html_safe }
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
|
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;background-color:#6b4fbb;height:4px;font-size:4px;line-height:4px;" }
|
||||||
%tr.header
|
%tr.header
|
||||||
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
|
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
|
||||||
%img{ alt: "GitLab", height: "50", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo.gif'), width: "55" }
|
%img{ alt: "GitLab", height: "55", src: image_url('mailers/gitlab_logo.png'), width: "55" }
|
||||||
%tr
|
%tr
|
||||||
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
|
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;" }
|
||||||
%table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" }
|
%table.wrapper{ border: "0", cellpadding: "0", cellspacing: "0", style: "width:640px;margin:0 auto;border-collapse:separate;border-spacing:0;" }
|
||||||
|
@ -146,7 +146,7 @@
|
||||||
|
|
||||||
%tr.footer
|
%tr.footer
|
||||||
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
|
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;padding:25px 0;font-size:13px;line-height:1.6;color:#5c5c5c;" }
|
||||||
%img{ alt: "GitLab", height: "33", src: image_url('mailers/ci_pipeline_notif_v1/gitlab-logo-full-horizontal.gif'), style: "display:block;margin:0 auto 1em;", width: "90" }
|
%img{ alt: "GitLab", src: image_url('mailers/gitlab_logo_black_text.png'), style: "display:block;margin:0 auto 1em;", width: "90" }
|
||||||
%div
|
%div
|
||||||
- manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;")
|
- manage_notifications_link = link_to(_("Manage all notifications"), profile_notifications_url, style: "color:#3777b0;text-decoration:none;")
|
||||||
- help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;")
|
- help_link = link_to(_("Help"), help_url, style: "color:#3777b0;text-decoration:none;")
|
||||||
|
|
|
@ -19,8 +19,7 @@
|
||||||
- if can?(current_user, :read_project, @project)
|
- if can?(current_user, :read_project, @project)
|
||||||
%span.gl-display-inline-block.gl-vertical-align-middle
|
%span.gl-display-inline-block.gl-vertical-align-middle
|
||||||
= s_('ProjectPage|Project ID: %{project_id}') % { project_id: @project.id }
|
= s_('ProjectPage|Project ID: %{project_id}') % { project_id: @project.id }
|
||||||
- button_class = "btn gl-button btn-sm btn-tertiary btn-default-tertiary home-panel-metadata"
|
= clipboard_button(title: s_('ProjectPage|Copy project ID'), text: @project.id)
|
||||||
= clipboard_button(title: s_('ProjectPage|Copy project ID'), text: @project.id, class: button_class)
|
|
||||||
- if current_user
|
- if current_user
|
||||||
%span.gl-ml-3.gl-mb-3
|
%span.gl-ml-3.gl-mb-3
|
||||||
= render 'shared/members/access_request_links', source: @project
|
= render 'shared/members/access_request_links', source: @project
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
<svg width="24" height="24" class="tanuki-logo" viewBox="0 0 36 36">
|
<svg class="tanuki-logo" width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
<path class="tanuki-shape tanuki-left-ear" fill="#e24329" d="M2 14l9.38 9v-9l-4-12.28c-.205-.632-1.176-.632-1.38 0z"/>
|
<path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
<path class="tanuki-shape tanuki-right-ear" fill="#e24329" d="M34 14l-9.38 9v-9l4-12.28c.205-.632 1.176-.632 1.38 0z"/>
|
fill="#E24329"/>
|
||||||
<path class="tanuki-shape tanuki-nose" fill="#e24329" d="M18,34.38 3,14 33,14 Z"/>
|
<path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
<path class="tanuki-shape tanuki-left-eye" fill="#fc6d26" d="M18,34.38 11.38,14 2,14 6,25Z"/>
|
fill="#FC6D26"/>
|
||||||
<path class="tanuki-shape tanuki-right-eye" fill="#fc6d26" d="M18,34.38 24.62,14 34,14 30,25Z"/>
|
<path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
|
||||||
<path class="tanuki-shape tanuki-left-cheek" fill="#fca326" d="M2 14L.1 20.16c-.18.565 0 1.2.5 1.56l17.42 12.66z"/>
|
fill="#FCA326"/>
|
||||||
<path class="tanuki-shape tanuki-right-cheek" fill="#fca326" d="M34 14l1.9 6.16c.18.565 0 1.2-.5 1.56L18 34.38z"/>
|
<path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 834 B After Width: | Height: | Size: 1.0 KiB |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 617 169"><path d="M315.26 2.97h-21.8l.1 162.5h88.3v-20.1h-66.5l-.1-142.4M465.89 136.95c-5.5 5.7-14.6 11.4-27 11.4-16.6 0-23.3-8.2-23.3-18.9 0-16.1 11.2-23.8 35-23.8 4.5 0 11.7.5 15.4 1.2v30.1h-.1m-22.6-98.5c-17.6 0-33.8 6.2-46.4 16.7l7.7 13.4c8.9-5.2 19.8-10.4 35.5-10.4 17.9 0 25.8 9.2 25.8 24.6v7.9c-3.5-.7-10.7-1.2-15.1-1.2-38.2 0-57.6 13.4-57.6 41.4 0 25.1 15.4 37.7 38.7 37.7 15.7 0 30.8-7.2 36-18.9l4 15.9h15.4v-83.2c-.1-26.3-11.5-43.9-44-43.9M557.63 149.1c-8.2 0-15.4-1-20.8-3.5V70.5c7.4-6.2 16.6-10.7 28.3-10.7 21.1 0 29.2 14.9 29.2 39 0 34.2-13.1 50.3-36.7 50.3m9.2-110.6c-19.5 0-30 13.3-30 13.3v-21l-.1-27.8h-21.3l.1 158.5c10.7 4.5 25.3 6.9 41.2 6.9 40.7 0 60.3-26 60.3-70.9-.1-35.5-18.2-59-50.2-59M77.9 20.6c19.3 0 31.8 6.4 39.9 12.9l9.4-16.3C114.5 6 97.3 0 78.9 0 32.5 0 0 28.3 0 85.4c0 59.8 35.1 83.1 75.2 83.1 20.1 0 37.2-4.7 48.4-9.4l-.5-63.9V75.1H63.6v20.1h38l.5 48.5c-5 2.5-13.6 4.5-25.3 4.5-32.2 0-53.8-20.3-53.8-63-.1-43.5 22.2-64.6 54.9-64.6M231.43 2.95h-21.3l.1 27.3v94.3c0 26.3 11.4 43.9 43.9 43.9 4.5 0 8.9-.4 13.1-1.2v-19.1c-3.1.5-6.4.7-9.9.7-17.9 0-25.8-9.2-25.8-24.6v-65h35.7v-17.8h-35.7l-.1-38.5M155.96 165.47h21.3v-124h-21.3v124M155.96 24.37h21.3V3.07h-21.3v21.3"/></svg>
|
|
Before Width: | Height: | Size: 1.2 KiB |
|
@ -1,5 +0,0 @@
|
||||||
<svg width="24" height="24" class="tanuki-logo" viewBox="0 0 24 24">
|
|
||||||
<path d="M4.89929534,0.3165 L7.56629534,8.5025 L16.3922953,8.5025 L19.0592953,0.3165 C19.1962953,-0.1055 19.8432953,-0.1055 19.9792953,0.3165 L23.9122953,12.6095 C23.9722953,12.7935 23.9722953,12.9895 23.9192953,13.1695 L0.0392953418,13.1695 C-0.0143874393,12.9863283 -0.0119492421,12.7912726 0.0462953418,12.6095 L3.97929534,0.3165 C4.11529534,-0.1055 4.76229534,-0.1055 4.89929534,0.3165 Z" id="Path" fill="#005BBB"></path>
|
|
||||||
<path d="M7.20329534,9.0025 L16.7552953,9.0025 L16.8682953,8.6575 L19.5182953,0.5185 L23.4362953,12.7615 C23.4961172,12.9376949 23.435535,13.1323657 23.2862953,13.2435 L23.2852953,13.2455 L11.9852953,21.4655 L11.9792953,21.4715 L0.673295342,13.2455 C0.522422013,13.1321007 0.462258936,12.9374792 0.522295342,12.7615 L4.43929534,0.5185 L7.09029534,8.6585 L7.20329534,9.0025 Z" id="Shape" stroke="#FFFFFF" opacity="0.32" stroke-linejoin="round"></path>
|
|
||||||
<path d="M0.0012953418,12.8575 C-0.0152229638,13.1685309 0.127095079,13.4667211 0.379295342,13.6495 L11.9792953,22.0895 L11.9862953,22.0845 L11.9922953,22.0895 L11.9872953,22.0835 L23.5792953,13.6495 C23.8319507,13.466647 23.9743476,13.1679148 23.9572953,12.8565 L0.0012953418,12.8565 L0.0012953418,12.8575 Z" id="Path" fill="#FFD500"></path>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1,12 @@
|
||||||
|
<svg class="tanuki-logo" width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path class="logo-text" d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
|
||||||
|
fill="#171321"/>
|
||||||
|
<path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#E24329"/>
|
||||||
|
<path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
<path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
|
||||||
|
fill="#FCA326"/>
|
||||||
|
<path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1,12 @@
|
||||||
|
<svg class="tanuki-logo" width="111" height="24" viewBox="0 0 111 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path class="logo-text" d="M44.814 9.042h3.645c-.608-3.875-3.963-6.574-8.33-6.574-5.166 0-9.043 3.798-9.043 10.16 0 6.248 3.703 10.123 9.15 10.123 4.887 0 8.386-3.144 8.386-8.234v-2.37h-8.01v2.794h4.55c-.058 2.816-1.938 4.599-4.908 4.599-3.305 0-5.57-2.477-5.57-6.95 0-4.445 2.303-6.913 5.494-6.913 2.38 0 4.01 1.272 4.636 3.365Zm6.218 13.438h3.49V7.68h-3.49v14.8Zm1.76-17.151c1.109 0 2.014-.85 2.014-1.89s-.905-1.9-2.014-1.9c-1.109 0-2.024.849-2.024 1.9s.9 1.89 2.017 1.89h.007ZM64.971 7.68H62.05V4.126h-3.49v3.556h-2.1v2.699h2.1v8.233c-.018 2.786 2.007 4.16 4.628 4.079a7.089 7.089 0 0 0 2.055-.348l-.59-2.73a4.247 4.247 0 0 1-1.02.137c-.878 0-1.582-.309-1.582-1.717v-7.662h2.921V7.68Zm2.701 14.8h12.272v-2.998H71.25V2.737h-3.578V22.48Zm18.957.3c2.323 0 3.71-1.09 4.347-2.333h.115v2.033h3.36v-9.91c0-3.913-3.19-5.09-6.016-5.09-3.113 0-5.504 1.388-6.275 4.087l3.26.464c.345-1.013 1.329-1.88 3.04-1.88 1.62 0 2.506.829 2.506 2.285v.057c0 1.002-1.05 1.051-3.664 1.33-2.872.309-5.619 1.166-5.619 4.502-.01 2.912 2.12 4.455 4.946 4.455Zm1.147-2.56c-1.456 0-2.498-.666-2.498-1.948 0-1.34 1.167-1.899 2.72-2.121.917-.125 2.75-.357 3.2-.722v1.744c.01 1.643-1.321 3.042-3.422 3.042v.005Zm9.244 2.26h3.433v-2.332h.201c.551 1.08 1.698 2.593 4.244 2.593 3.489 0 6.102-2.768 6.102-7.644 0-4.936-2.69-7.616-6.112-7.616-2.613 0-3.702 1.57-4.234 2.641h-.147V2.737h-3.486V22.48Zm3.423-7.403c0-2.88 1.234-4.734 3.48-4.734 2.323 0 3.52 1.976 3.52 4.734 0 2.759-1.214 4.8-3.52 4.8-2.227 0-3.48-1.928-3.48-4.8Z"
|
||||||
|
fill="#fff"/>
|
||||||
|
<path class="tanuki-shape tanuki" d="m24.507 9.5-.034-.09L21.082.562a.896.896 0 0 0-1.694.091l-2.29 7.01H7.825L5.535.653a.898.898 0 0 0-1.694-.09L.451 9.411.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 2.56 1.935 1.554 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#E24329"/>
|
||||||
|
<path class="tanuki-shape right-cheek" d="m24.507 9.5-.034-.09a11.44 11.44 0 0 0-4.56 2.051l-7.447 5.632 4.742 3.584 5.197-3.89.014-.01A6.297 6.297 0 0 0 24.507 9.5Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
<path class="tanuki-shape chin" d="m7.707 20.677 2.56 1.935 1.555 1.176a1.051 1.051 0 0 0 1.268 0l1.555-1.176 2.56-1.935-4.743-3.584-4.755 3.584Z"
|
||||||
|
fill="#FCA326"/>
|
||||||
|
<path class="tanuki-shape left-cheek" d="M5.01 11.461a11.43 11.43 0 0 0-4.56-2.05L.416 9.5a6.297 6.297 0 0 0 2.09 7.278l.012.01.03.022 5.16 3.867 4.745-3.584-7.444-5.632Z"
|
||||||
|
fill="#FC6D26"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -163,9 +163,9 @@
|
||||||
.block.reference
|
.block.reference
|
||||||
.sidebar-collapsed-icon.js-dont-change-state
|
.sidebar-collapsed-icon.js-dont-change-state
|
||||||
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
|
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
|
||||||
.cross-project-reference.hide-collapsed
|
.gl-display-flex.gl-align-items-center.gl-justify-content-space-between.gl-mb-2.hide-collapsed
|
||||||
%span.gl-display-inline-block.gl-text-truncate
|
%span.gl-overflow-hidden.gl-text-overflow-ellipsis.gl-white-space-nowrap
|
||||||
= s_('MilestoneSidebar|Reference:')
|
= s_('MilestoneSidebar|Reference:')
|
||||||
%span{ title: milestone_ref }
|
%span{ title: milestone_ref }
|
||||||
= milestone_ref
|
= milestone_ref
|
||||||
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport', class: 'btn-clipboard btn-transparent gl-float-right gl-bg-gray-10')
|
= clipboard_button(text: milestone_ref, title: s_('MilestoneSidebar|Copy reference'), placement: "left", boundary: 'viewport')
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
---
|
|
||||||
name: ukraine_support_tanuki
|
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82050
|
|
||||||
rollout_issue_url:
|
|
||||||
milestone: '14.9'
|
|
||||||
type: development
|
|
||||||
group: group::editor
|
|
||||||
default_enabled: false
|
|
|
@ -401,8 +401,6 @@
|
||||||
- 1
|
- 1
|
||||||
- - repository_import
|
- - repository_import
|
||||||
- 1
|
- 1
|
||||||
- - repository_push_audit_event
|
|
||||||
- 1
|
|
||||||
- - repository_remove_remote
|
- - repository_remove_remote
|
||||||
- 1
|
- 1
|
||||||
- - repository_update_mirror
|
- - repository_update_mirror
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
|
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
|
||||||
breaking_change: true
|
breaking_change: true
|
||||||
body: | # Do not modify this line, instead modify the lines below.
|
body: | # Do not modify this line, instead modify the lines below.
|
||||||
Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated) are now deprecated and will be removed in GitLab 15.0.
|
Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are now deprecated and will be removed in GitLab 15.0.
|
||||||
|
|
||||||
These events have always been disabled by default and had to be manually enabled with a
|
These events have always been disabled by default and had to be manually enabled with a
|
||||||
feature flag. Enabling them can cause too many events to be generated which can
|
feature flag. Enabling them can cause too many events to be generated which can
|
||||||
|
@ -13,4 +13,4 @@
|
||||||
stage: Manage
|
stage: Manage
|
||||||
tiers: Premium
|
tiers: Premium
|
||||||
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337993
|
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337993
|
||||||
documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated
|
documentation_url: https://docs.gitlab.com/ee/administration/audit_events.html#removed-events
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
- name: "Update to the Container Registry group-level API"
|
||||||
|
announcement_milestone: "14.5" # The milestone when this feature was first announced as deprecated.
|
||||||
|
announcement_date: "2021-11-22"
|
||||||
|
removal_milestone: "15.0" # the milestone when this feature is planned to be removed
|
||||||
|
removal_date: "2022-05-22" # the date of the milestone release when this feature is planned to be removed
|
||||||
|
breaking_change: true
|
||||||
|
body: | # Do not modify this line, instead modify the lines below.
|
||||||
|
In GitLab 15.0, support for the `tags` and `tags_count` parameters will be removed from the Container Registry API that [gets registry repositories from a group](../api/container_registry.md#within-a-group).
|
||||||
|
|
||||||
|
The `GET /groups/:id/registry/repositories` endpoint will remain, but won't return any info about tags. To get the info about tags, you can use the existing `GET /registry/repositories/:id` endpoint, which will continue to support the `tags` and `tag_count` options as it does today. The latter must be called once per image repository.
|
||||||
|
stage: Package
|
||||||
|
tiers: Free
|
||||||
|
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336912
|
||||||
|
documentation_url: https://docs.gitlab.com/ee/api/container_registry.html#within-a-group
|
|
@ -262,36 +262,15 @@ Don't see the event you want in any of the epics linked above? You can either:
|
||||||
request it.
|
request it.
|
||||||
- [Add it yourself](../development/audit_event_guide/).
|
- [Add it yourself](../development/audit_event_guide/).
|
||||||
|
|
||||||
### Disabled events
|
### Removed events
|
||||||
|
|
||||||
#### Repository push (DEPRECATED)
|
> - Repositories push events was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
|
||||||
|
> - Repositories push events was [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 15.0.
|
||||||
|
|
||||||
> [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
|
The repositories push events feature was:
|
||||||
|
|
||||||
WARNING:
|
- [Deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
|
||||||
This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/337993) in GitLab 14.3.
|
- [Removed]((https://gitlab.com/gitlab-org/gitlab/-/issues/337993)) in GitLab 15.0.
|
||||||
|
|
||||||
The current architecture of audit events is not prepared to receive a very high amount of records.
|
|
||||||
It may make the user interface for your project or audit events very busy, and the disk space consumed by the
|
|
||||||
`audit_events` PostgreSQL table may increase considerably. It's disabled by default
|
|
||||||
to prevent performance degradations on GitLab instances with very high Git write traffic.
|
|
||||||
|
|
||||||
If you still wish to enable **Repository push** events in your instance, follow
|
|
||||||
the steps below.
|
|
||||||
|
|
||||||
**In Omnibus installations:**
|
|
||||||
|
|
||||||
1. Enter the Rails console:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo gitlab-rails console
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Flip the switch and enable the feature flag:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
Feature.enable(:repository_push_audit_event)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Search
|
## Search
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,8 @@ Example response:
|
||||||
|
|
||||||
### Within a group
|
### Within a group
|
||||||
|
|
||||||
|
> [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/336912) the `tags` and `tag_count` attributes in GitLab 15.0.
|
||||||
|
|
||||||
Get a list of registry repositories in a group.
|
Get a list of registry repositories in a group.
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
|
@ -136,12 +138,10 @@ GET /groups/:id/registry/repositories
|
||||||
| Attribute | Type | Required | Description |
|
| Attribute | Type | Required | Description |
|
||||||
| --------- | ---- | -------- | ----------- |
|
| --------- | ---- | -------- | ----------- |
|
||||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) accessible by the authenticated user. |
|
| `id` | integer/string | yes | The ID or [URL-encoded path of the group](index.md#namespaced-path-encoding) accessible by the authenticated user. |
|
||||||
| `tags` | boolean | no | If the parameter is included as true, each repository includes an array of `"tags"` in the response. |
|
|
||||||
| `tags_count` | boolean | no | If the parameter is included as true, each repository includes `"tags_count"` in the response ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32141) in GitLab 13.1). |
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
curl --header "PRIVATE-TOKEN: <your_access_token>" \
|
curl --header "PRIVATE-TOKEN: <your_access_token>" \
|
||||||
"https://gitlab.example.com/api/v4/groups/2/registry/repositories?tags=1&tags_count=true"
|
"https://gitlab.example.com/api/v4/groups/2/registry/repositories"
|
||||||
```
|
```
|
||||||
|
|
||||||
Example response:
|
Example response:
|
||||||
|
|
|
@ -315,7 +315,7 @@ Example response:
|
||||||
|
|
||||||
## Delete group cluster
|
## Delete group cluster
|
||||||
|
|
||||||
Deletes an existing group cluster.
|
Deletes an existing group cluster. Does not remove existing resources within the connected Kubernetes cluster.
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
DELETE /groups/:id/clusters/:cluster_id
|
DELETE /groups/:id/clusters/:cluster_id
|
||||||
|
|
|
@ -290,7 +290,7 @@ Example response:
|
||||||
|
|
||||||
## Delete instance cluster
|
## Delete instance cluster
|
||||||
|
|
||||||
Deletes an existing instance cluster.
|
Deletes an existing instance cluster. Does not remove existing resources within the connected Kubernetes cluster.
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
DELETE /admin/clusters/:cluster_id
|
DELETE /admin/clusters/:cluster_id
|
||||||
|
|
|
@ -388,7 +388,7 @@ Example response:
|
||||||
|
|
||||||
## Delete project cluster
|
## Delete project cluster
|
||||||
|
|
||||||
Deletes an existing project cluster.
|
Deletes an existing project cluster. Does not remove existing resources within the connected Kubernetes cluster.
|
||||||
|
|
||||||
```plaintext
|
```plaintext
|
||||||
DELETE /projects/:id/clusters/:cluster_id
|
DELETE /projects/:id/clusters/:cluster_id
|
||||||
|
|
|
@ -65,7 +65,7 @@ the tiers are no longer mentioned in GitLab documentation:
|
||||||
- Merge requests:
|
- Merge requests:
|
||||||
- [Full code quality reports in the code quality tab](../user/project/merge_requests/code_quality.md#code-quality-reports)
|
- [Full code quality reports in the code quality tab](../user/project/merge_requests/code_quality.md#code-quality-reports)
|
||||||
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
|
- [Merge request approvals](../user/project/merge_requests/approvals/index.md)
|
||||||
- [Multiple assignees](../user/project/merge_requests/getting_started.md#multiple-assignees)
|
- [Multiple assignees](../user/project/merge_requests/index.md#assign-multiple-users)
|
||||||
- [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers)
|
- [Approval Rule information for Reviewers](../user/project/merge_requests/reviews/index.md#approval-rule-information-for-reviewers)
|
||||||
- [Required Approvals](../user/project/merge_requests/approvals/index.md#required-approvals)
|
- [Required Approvals](../user/project/merge_requests/approvals/index.md#required-approvals)
|
||||||
- [Code Owners as eligible approvers](../user/project/merge_requests/approvals/rules.md#code-owners-as-eligible-approvers)
|
- [Code Owners as eligible approvers](../user/project/merge_requests/approvals/rules.md#code-owners-as-eligible-approvers)
|
||||||
|
|
|
@ -1517,7 +1517,7 @@ as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#brea
|
||||||
Before updating GitLab, review the details carefully to determine if you need to make any
|
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||||
changes to your code, settings, or workflow.
|
changes to your code, settings, or workflow.
|
||||||
|
|
||||||
Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#repository-push-deprecated) are now deprecated and will be removed in GitLab 15.0.
|
Audit events for [repository events](https://docs.gitlab.com/ee/administration/audit_events.html#removed-events) are now deprecated and will be removed in GitLab 15.0.
|
||||||
|
|
||||||
These events have always been disabled by default and had to be manually enabled with a
|
These events have always been disabled by default and had to be manually enabled with a
|
||||||
feature flag. Enabling them can cause too many events to be generated which can
|
feature flag. Enabling them can cause too many events to be generated which can
|
||||||
|
|
|
@ -80,6 +80,18 @@ The permissions model for GraphQL is being updated. After 15.0, users with the G
|
||||||
|
|
||||||
The issue for this removal is [GitLab-#350682](https://gitlab.com/gitlab-org/gitlab/-/issues/350682)
|
The issue for this removal is [GitLab-#350682](https://gitlab.com/gitlab-org/gitlab/-/issues/350682)
|
||||||
|
|
||||||
|
### Update to the Container Registry group-level API
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
This feature was changed or removed in 15.0
|
||||||
|
as a [breaking change](https://docs.gitlab.com/ee/development/contributing/#breaking-changes).
|
||||||
|
Before updating GitLab, review the details carefully to determine if you need to make any
|
||||||
|
changes to your code, settings, or workflow.
|
||||||
|
|
||||||
|
In GitLab 15.0, support for the `tags` and `tags_count` parameters will be removed from the Container Registry API that [gets registry repositories from a group](../api/container_registry.md#within-a-group).
|
||||||
|
|
||||||
|
The `GET /groups/:id/registry/repositories` endpoint will remain, but won't return any info about tags. To get the info about tags, you can use the existing `GET /registry/repositories/:id` endpoint, which will continue to support the `tags` and `tag_count` options as it does today. The latter must be called once per image repository.
|
||||||
|
|
||||||
### Vulnerability Check
|
### Vulnerability Check
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
|
@ -73,7 +73,8 @@ observability:
|
||||||
|
|
||||||
## Reset the agent token
|
## Reset the agent token
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327152) in GitLab 14.9.
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/327152) in GitLab 14.9.
|
||||||
|
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/336641) in GitLab 14.10, the agent token can be revoked from the UI.
|
||||||
|
|
||||||
To reset the agent token without downtime:
|
To reset the agent token without downtime:
|
||||||
|
|
||||||
|
@ -81,11 +82,11 @@ To reset the agent token without downtime:
|
||||||
1. On the top bar, select **Menu > Projects** and find your project.
|
1. On the top bar, select **Menu > Projects** and find your project.
|
||||||
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
|
1. On the left sidebar, select **Infrastructure > Kubernetes clusters**.
|
||||||
1. Select the agent you want to create a token for.
|
1. Select the agent you want to create a token for.
|
||||||
1. On the **Tokens** tab, select **Create token**.
|
1. On the **Access tokens** tab, select **Create token**.
|
||||||
1. Enter token's name and description (optional) and select **Create token**.
|
1. Enter token's name and description (optional) and select **Create token**.
|
||||||
1. Securely store the generated token.
|
1. Securely store the generated token.
|
||||||
1. Use the token to [install the agent in your cluster](install/index.md#install-the-agent-in-the-cluster) and to [update the agent](install/index.md#update-the-agent-version) to another version.
|
1. Use the token to [install the agent in your cluster](install/index.md#install-the-agent-in-the-cluster) and to [update the agent](install/index.md#update-the-agent-version) to another version.
|
||||||
1. Delete the token you're no longer using.
|
1. To delete the token you're no longer using, return to the token list and select **Revoke** (**{remove}**).
|
||||||
|
|
||||||
## Remove an agent
|
## Remove an agent
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ options. You can also add them later by either selecting **Edit** on the merge
|
||||||
request's page at the top-right side, or by using
|
request's page at the top-right side, or by using
|
||||||
[keyboard shortcuts for merge requests](../../shortcuts.md#issues-and-merge-requests):
|
[keyboard shortcuts for merge requests](../../shortcuts.md#issues-and-merge-requests):
|
||||||
|
|
||||||
- [Assign](#assignee) the merge request to a colleague for review. With [multiple assignees](#multiple-assignees), you can assign it to more than one person at a time.
|
- [Assign](index.md#assign-a-user-to-a-merge-request) the merge request to a colleague for review. With [multiple assignees](index.md#assign-multiple-users), you can assign it to more than one person at a time.
|
||||||
- Set a [milestone](../milestones/index.md) to track time-sensitive changes.
|
- Set a [milestone](../milestones/index.md) to track time-sensitive changes.
|
||||||
- Add [labels](../labels.md) to help contextualize and filter your merge requests over time.
|
- Add [labels](../labels.md) to help contextualize and filter your merge requests over time.
|
||||||
- [Require approval](approvals/index.md#required-approvals) from your team.
|
- [Require approval](approvals/index.md#required-approvals) from your team.
|
||||||
|
@ -81,38 +81,6 @@ Many of these options can be set:
|
||||||
|
|
||||||
See also other [features associated to merge requests](reviews/index.md#associated-features).
|
See also other [features associated to merge requests](reviews/index.md#associated-features).
|
||||||
|
|
||||||
### Assignee
|
|
||||||
|
|
||||||
Choose an assignee to designate someone as the person responsible
|
|
||||||
for the first [review of the merge request](reviews/index.md).
|
|
||||||
Open the drop down box to search for the user you wish to assign,
|
|
||||||
and the merge request is added to their
|
|
||||||
[assigned merge request list](../../search/index.md#search-issues-and-merge-requests).
|
|
||||||
|
|
||||||
#### Multiple assignees **(PREMIUM)**
|
|
||||||
|
|
||||||
> Moved to GitLab Premium in 13.9
|
|
||||||
|
|
||||||
Multiple people often review merge requests at the same time.
|
|
||||||
GitLab allows you to have multiple assignees for merge requests
|
|
||||||
to indicate everyone that is reviewing or accountable for it.
|
|
||||||
|
|
||||||
![multiple assignees for merge requests sidebar](img/multiple_assignees_for_merge_requests_sidebar.png)
|
|
||||||
|
|
||||||
To assign multiple assignees to a merge request:
|
|
||||||
|
|
||||||
1. From a merge request, expand the right sidebar and locate the **Assignees** section.
|
|
||||||
1. Click on **Edit** and from the dropdown menu, select as many users as you want
|
|
||||||
to assign the merge request to.
|
|
||||||
|
|
||||||
Similarly, assignees are removed by deselecting them from the same
|
|
||||||
dropdown menu.
|
|
||||||
|
|
||||||
It is also possible to manage multiple assignees:
|
|
||||||
|
|
||||||
- When creating a merge request.
|
|
||||||
- Using [quick actions](../quick_actions.md#issues-merge-requests-and-epics).
|
|
||||||
|
|
||||||
### Reviewer
|
### Reviewer
|
||||||
|
|
||||||
WARNING:
|
WARNING:
|
||||||
|
|
|
@ -70,6 +70,72 @@ change and whether you need access to a development environment:
|
||||||
- [Push changes from the command line](../../../gitlab-basics/start-using-git.md), if you are
|
- [Push changes from the command line](../../../gitlab-basics/start-using-git.md), if you are
|
||||||
familiar with Git and the command line.
|
familiar with Git and the command line.
|
||||||
|
|
||||||
|
## Assign a user to a merge request
|
||||||
|
|
||||||
|
When a merge request is created, it's assigned by default to the person who created it.
|
||||||
|
This person owns the merge request, but isn't responsible for [reviewing it](reviews/index.md).
|
||||||
|
To assign the merge request to someone else, use the `/assign @user`
|
||||||
|
[quick action](../quick_actions.md#issues-merge-requests-and-epics) in a text area in
|
||||||
|
a merge request, or:
|
||||||
|
|
||||||
|
1. On the top bar, select **Menu > Projects** and find your project.
|
||||||
|
1. On the left sidebar, select **Merge requests** and find your merge request.
|
||||||
|
1. On the right sidebar, expand the right sidebar and locate the **Assignees** section.
|
||||||
|
1. Select **Edit**.
|
||||||
|
1. Search for the user you want to assign, and select the user.
|
||||||
|
|
||||||
|
The merge request is added to the user's
|
||||||
|
[assigned merge request list](../../search/index.md#search-issues-and-merge-requests).
|
||||||
|
|
||||||
|
### Assign multiple users **(PREMIUM)**
|
||||||
|
|
||||||
|
> Moved to GitLab Premium in 13.9.
|
||||||
|
|
||||||
|
GitLab enables multiple assignees for merge requests, if multiple people are
|
||||||
|
accountable for it:
|
||||||
|
|
||||||
|
![multiple assignees for merge requests sidebar](img/multiple_assignees_for_merge_requests_sidebar.png)
|
||||||
|
|
||||||
|
To assign multiple assignees to a merge request, use the `/assign @user`
|
||||||
|
[quick action](../quick_actions.md#issues-merge-requests-and-epics) in a text area, or:
|
||||||
|
|
||||||
|
1. On the top bar, select **Menu > Projects** and find your project.
|
||||||
|
1. On the left sidebar, select **Merge requests** and find your merge request.
|
||||||
|
1. On the right sidebar, expand the right sidebar and locate the **Assignees** section.
|
||||||
|
1. Select **Edit** and, from the dropdown list, select all users you want
|
||||||
|
to assign the merge request to.
|
||||||
|
|
||||||
|
To remove an assignee, clear the user from the same dropdown list.
|
||||||
|
|
||||||
|
## Close a merge request
|
||||||
|
|
||||||
|
If you decide to permanently stop work on a merge request,
|
||||||
|
GitLab recommends you close the merge request rather than
|
||||||
|
[delete it](#delete-a-merge-request). The author and assignees of a merge request, and users with
|
||||||
|
Developer, Maintainer, or Owner [roles](../../permissions.md) in a project
|
||||||
|
can close merge requests in the project:
|
||||||
|
|
||||||
|
1. Go to the merge request you want to close.
|
||||||
|
1. Scroll to the comment box at the bottom of the page.
|
||||||
|
1. Following the comment box, select **Close merge request**.
|
||||||
|
|
||||||
|
GitLab closes the merge request, but preserves records of the merge request,
|
||||||
|
its comments, and any associated pipelines.
|
||||||
|
|
||||||
|
### Delete a merge request
|
||||||
|
|
||||||
|
GitLab recommends you close, rather than delete, merge requests.
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
You cannot undo the deletion of a merge request.
|
||||||
|
|
||||||
|
To delete a merge request:
|
||||||
|
|
||||||
|
1. Sign in to GitLab as a user with the project Owner role.
|
||||||
|
Only users with this role can delete merge requests in a project.
|
||||||
|
1. Go to the merge request you want to delete, and select **Edit**.
|
||||||
|
1. Scroll to the bottom of the page, and select **Delete merge request**.
|
||||||
|
|
||||||
## Request attention to a merge request
|
## Request attention to a merge request
|
||||||
|
|
||||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `mr_attention_requests`. Disabled by default.
|
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/343528) in GitLab 14.10 [with a flag](../../../administration/feature_flags.md) named `mr_attention_requests`. Disabled by default.
|
||||||
|
@ -117,35 +183,6 @@ only one attention request, which is synced across both duties. If the
|
||||||
attention request is removed from you, either as an assignee or a reviewer,
|
attention request is removed from you, either as an assignee or a reviewer,
|
||||||
it is removed from both your duties.
|
it is removed from both your duties.
|
||||||
|
|
||||||
## Close a merge request
|
|
||||||
|
|
||||||
If you decide to permanently stop work on a merge request,
|
|
||||||
GitLab recommends you close the merge request rather than
|
|
||||||
[delete it](#delete-a-merge-request). The author and assignees of a merge request, and users with
|
|
||||||
Developer, Maintainer, or Owner [roles](../../permissions.md) in a project
|
|
||||||
can close merge requests in the project:
|
|
||||||
|
|
||||||
1. Go to the merge request you want to close.
|
|
||||||
1. Scroll to the comment box at the bottom of the page.
|
|
||||||
1. Following the comment box, select **Close merge request**.
|
|
||||||
|
|
||||||
GitLab closes the merge request, but preserves records of the merge request,
|
|
||||||
its comments, and any associated pipelines.
|
|
||||||
|
|
||||||
### Delete a merge request
|
|
||||||
|
|
||||||
GitLab recommends you close, rather than delete, merge requests.
|
|
||||||
|
|
||||||
WARNING:
|
|
||||||
You cannot undo the deletion of a merge request.
|
|
||||||
|
|
||||||
To delete a merge request:
|
|
||||||
|
|
||||||
1. Sign in to GitLab as a user with the project Owner role.
|
|
||||||
Only users with this role can delete merge requests in a project.
|
|
||||||
1. Go to the merge request you want to delete, and select **Edit**.
|
|
||||||
1. Scroll to the bottom of the page, and select **Delete merge request**.
|
|
||||||
|
|
||||||
## Merge request workflows
|
## Merge request workflows
|
||||||
|
|
||||||
For a software developer working in a team:
|
For a software developer working in a team:
|
||||||
|
|
|
@ -63,7 +63,6 @@ Currently, the following names are reserved as top level groups:
|
||||||
- `503.html`
|
- `503.html`
|
||||||
- `admin`
|
- `admin`
|
||||||
- `api`
|
- `api`
|
||||||
- `apple-touch-icon-precomposed.png`
|
|
||||||
- `apple-touch-icon.png`
|
- `apple-touch-icon.png`
|
||||||
- `assets`
|
- `assets`
|
||||||
- `dashboard`
|
- `dashboard`
|
||||||
|
|
|
@ -8,6 +8,7 @@ module API
|
||||||
before { authenticate! }
|
before { authenticate! }
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
params do
|
params do
|
||||||
requires :id, type: String, desc: 'The ID of a project'
|
requires :id, type: String, desc: 'The ID of a project'
|
||||||
|
|
|
@ -51,7 +51,7 @@ module API
|
||||||
desc: 'Sort pipelines'
|
desc: 'Sort pipelines'
|
||||||
optional :source, type: String, values: ::Ci::Pipeline.sources.keys
|
optional :source, type: String, values: ::Ci::Pipeline.sources.keys
|
||||||
end
|
end
|
||||||
get ':id/pipelines', feature_category: :continuous_integration do
|
get ':id/pipelines', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :read_pipeline, user_project
|
authorize! :read_pipeline, user_project
|
||||||
authorize! :read_build, user_project
|
authorize! :read_build, user_project
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ module API
|
||||||
requires :ref, type: String, desc: 'Reference'
|
requires :ref, type: String, desc: 'Reference'
|
||||||
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
||||||
end
|
end
|
||||||
post ':id/pipeline', feature_category: :continuous_integration do
|
post ':id/pipeline', urgency: :low, feature_category: :continuous_integration do
|
||||||
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20711')
|
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20711')
|
||||||
|
|
||||||
authorize! :create_pipeline, user_project
|
authorize! :create_pipeline, user_project
|
||||||
|
@ -94,7 +94,7 @@ module API
|
||||||
params do
|
params do
|
||||||
optional :ref, type: String, desc: 'branch ref of pipeline'
|
optional :ref, type: String, desc: 'branch ref of pipeline'
|
||||||
end
|
end
|
||||||
get ':id/pipelines/latest', feature_category: :continuous_integration do
|
get ':id/pipelines/latest', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :read_pipeline, latest_pipeline
|
authorize! :read_pipeline, latest_pipeline
|
||||||
|
|
||||||
present latest_pipeline, with: Entities::Ci::Pipeline
|
present latest_pipeline, with: Entities::Ci::Pipeline
|
||||||
|
@ -107,7 +107,7 @@ module API
|
||||||
params do
|
params do
|
||||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||||
end
|
end
|
||||||
get ':id/pipelines/:pipeline_id', feature_category: :continuous_integration do
|
get ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :read_pipeline, pipeline
|
authorize! :read_pipeline, pipeline
|
||||||
|
|
||||||
present pipeline, with: Entities::Ci::Pipeline
|
present pipeline, with: Entities::Ci::Pipeline
|
||||||
|
@ -205,7 +205,7 @@ module API
|
||||||
params do
|
params do
|
||||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||||
end
|
end
|
||||||
delete ':id/pipelines/:pipeline_id', feature_category: :continuous_integration do
|
delete ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :destroy_pipeline, pipeline
|
authorize! :destroy_pipeline, pipeline
|
||||||
|
|
||||||
destroy_conditionally!(pipeline) do
|
destroy_conditionally!(pipeline) do
|
||||||
|
@ -220,7 +220,7 @@ module API
|
||||||
params do
|
params do
|
||||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||||
end
|
end
|
||||||
post ':id/pipelines/:pipeline_id/retry', feature_category: :continuous_integration do
|
post ':id/pipelines/:pipeline_id/retry', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :update_pipeline, pipeline
|
authorize! :update_pipeline, pipeline
|
||||||
|
|
||||||
response = pipeline.retry_failed(current_user)
|
response = pipeline.retry_failed(current_user)
|
||||||
|
@ -239,7 +239,7 @@ module API
|
||||||
params do
|
params do
|
||||||
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
||||||
end
|
end
|
||||||
post ':id/pipelines/:pipeline_id/cancel', feature_category: :continuous_integration do
|
post ':id/pipelines/:pipeline_id/cancel', urgency: :low, feature_category: :continuous_integration do
|
||||||
authorize! :update_pipeline, pipeline
|
authorize! :update_pipeline, pipeline
|
||||||
|
|
||||||
pipeline.cancel_running
|
pipeline.cancel_running
|
||||||
|
|
|
@ -8,6 +8,7 @@ module API
|
||||||
HTTP_GITLAB_EVENT_HEADER = "HTTP_#{::Gitlab::WebHooks::GITLAB_EVENT_HEADER}".underscore.upcase
|
HTTP_GITLAB_EVENT_HEADER = "HTTP_#{::Gitlab::WebHooks::GITLAB_EVENT_HEADER}".underscore.upcase
|
||||||
|
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
params do
|
params do
|
||||||
requires :id, type: String, desc: 'The ID of a project'
|
requires :id, type: String, desc: 'The ID of a project'
|
||||||
|
|
|
@ -5,6 +5,7 @@ require 'mime/types'
|
||||||
module API
|
module API
|
||||||
class CommitStatuses < ::API::Base
|
class CommitStatuses < ::API::Base
|
||||||
feature_category :continuous_integration
|
feature_category :continuous_integration
|
||||||
|
urgency :low
|
||||||
|
|
||||||
params do
|
params do
|
||||||
requires :id, type: String, desc: 'The ID of a project'
|
requires :id, type: String, desc: 'The ID of a project'
|
||||||
|
|
|
@ -373,7 +373,7 @@ module API
|
||||||
desc 'Get the merge request pipelines' do
|
desc 'Get the merge request pipelines' do
|
||||||
success Entities::Ci::PipelineBasic
|
success Entities::Ci::PipelineBasic
|
||||||
end
|
end
|
||||||
get ':id/merge_requests/:merge_request_iid/pipelines', feature_category: :continuous_integration do
|
get ':id/merge_requests/:merge_request_iid/pipelines', urgency: :low, feature_category: :continuous_integration do
|
||||||
pipelines = merge_request_pipelines_with_access
|
pipelines = merge_request_pipelines_with_access
|
||||||
|
|
||||||
present paginate(pipelines), with: Entities::Ci::PipelineBasic
|
present paginate(pipelines), with: Entities::Ci::PipelineBasic
|
||||||
|
@ -382,7 +382,7 @@ module API
|
||||||
desc 'Create a pipeline for merge request' do
|
desc 'Create a pipeline for merge request' do
|
||||||
success ::API::Entities::Ci::Pipeline
|
success ::API::Entities::Ci::Pipeline
|
||||||
end
|
end
|
||||||
post ':id/merge_requests/:merge_request_iid/pipelines', feature_category: :continuous_integration do
|
post ':id/merge_requests/:merge_request_iid/pipelines', urgency: :low, feature_category: :continuous_integration do
|
||||||
pipeline = ::MergeRequests::CreatePipelineService
|
pipeline = ::MergeRequests::CreatePipelineService
|
||||||
.new(project: user_project, current_user: current_user, params: { allow_duplicate: true })
|
.new(project: user_project, current_user: current_user, params: { allow_duplicate: true })
|
||||||
.execute(find_merge_request_with_access(params[:merge_request_iid]))
|
.execute(find_merge_request_with_access(params[:merge_request_iid]))
|
||||||
|
|
|
@ -23,7 +23,6 @@ module Gitlab
|
||||||
503.html
|
503.html
|
||||||
admin
|
admin
|
||||||
api
|
api
|
||||||
apple-touch-icon-precomposed.png
|
|
||||||
apple-touch-icon.png
|
apple-touch-icon.png
|
||||||
assets
|
assets
|
||||||
dashboard
|
dashboard
|
||||||
|
|