Skip to content

Commit 0fc7ea6

Browse files
author
GitLab Bot
committed
Add latest changes from gitlab-org/gitlab@master
1 parent f850f5c commit 0fc7ea6

File tree

34 files changed

+559
-81
lines changed

34 files changed

+559
-81
lines changed

GITALY_SERVER_VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
4d333b2bb343d59410a80873e6185b8f8a2061a3
1+
6bd8110489a44adeacff1897a757d8ea52bf4f87

app/assets/javascripts/repository/components/header_area/blob_controls.vue

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { FIND_FILE_BUTTON_CLICK } from '~/tracking/constants';
2323
import { updateElementsVisibility } from '~/repository/utils/dom';
2424
import blobControlsQuery from '~/repository/queries/blob_controls.query.graphql';
2525
import { getRefType } from '~/repository/utils/ref_type';
26+
import OpenMrBadge from '~/repository/components/header_area/open_mr_badge.vue';
2627
import { TEXT_FILE_TYPE, DEFAULT_BLOB_INFO } from '../../constants';
2728
import OverflowMenu from './blob_overflow_menu.vue';
2829
@@ -36,6 +37,7 @@ export default {
3637
},
3738
buttonClassList: 'sm:gl-w-auto gl-w-full sm:gl-mt-0 gl-mt-3',
3839
components: {
40+
OpenMrBadge,
3941
GlButton,
4042
OverflowMenu,
4143
},
@@ -192,6 +194,11 @@ export default {
192194
</script>
193195
<template>
194196
<div v-if="showBlobControls" class="gl-flex gl-flex-wrap gl-items-center gl-gap-3">
197+
<open-mr-badge
198+
v-if="glFeatures.filterBlobPath"
199+
:project-path="projectPath"
200+
:blob-path="filePath"
201+
/>
195202
<gl-button
196203
v-gl-tooltip.html="findFileTooltip"
197204
:aria-keyshortcuts="findFileShortcutKey"

app/assets/javascripts/repository/components/header_area/blob_overflow_menu.vue

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export default {
126126
data-testid="default-actions-container"
127127
:toggle-text="$options.i18n.dropdownLabel"
128128
text-sr-only
129+
category="tertiary"
129130
>
130131
<permalink-dropdown-item :permalink-path="blobInfo.permalinkPath" />
131132
<blob-button-group
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<script>
2+
import { GlBadge } from '@gitlab/ui';
3+
import { sprintf, __ } from '~/locale';
4+
import getOpenMrCountsForBlobPath from '~/repository/queries/open_mr_counts.query.graphql';
5+
import { nDaysBefore } from '~/lib/utils/datetime/date_calculation_utility';
6+
import { toYmd } from '~/analytics/shared/utils';
7+
import { logError } from '~/lib/logger';
8+
import * as Sentry from '~/sentry/sentry_browser_wrapper';
9+
10+
const OPEN_MR_AGE_LIMIT_DAYS = 30;
11+
12+
export default {
13+
components: {
14+
GlBadge,
15+
},
16+
inject: ['currentRef'],
17+
props: {
18+
projectPath: {
19+
type: String,
20+
required: true,
21+
},
22+
blobPath: {
23+
type: String,
24+
required: true,
25+
},
26+
},
27+
data() {
28+
return {
29+
openMrsCount: null,
30+
};
31+
},
32+
computed: {
33+
openMRsCountText() {
34+
return sprintf(__('%{count} open'), { count: this.openMrsCount });
35+
},
36+
createdAfter() {
37+
const lookbackDate = nDaysBefore(new Date(), OPEN_MR_AGE_LIMIT_DAYS - 1, { utc: true });
38+
return toYmd(lookbackDate);
39+
},
40+
isLoading() {
41+
return this.$apollo.queries.loading;
42+
},
43+
showBadge() {
44+
return !this.isLoading && this.openMrsCount > 0;
45+
},
46+
queryVariables() {
47+
return {
48+
projectPath: this.projectPath,
49+
targetBranch: [this.currentRef],
50+
blobPath: this.blobPath,
51+
createdAfter: this.createdAfter,
52+
};
53+
},
54+
},
55+
apollo: {
56+
openMrsCount: {
57+
query: getOpenMrCountsForBlobPath,
58+
variables() {
59+
return this.queryVariables;
60+
},
61+
update({ project: { mergeRequests: { count } = {} } = {} } = {}) {
62+
return count;
63+
},
64+
error(error) {
65+
logError(
66+
`Failed to fetch merge request count. See exception details for more information.`,
67+
error,
68+
);
69+
Sentry.captureException(error);
70+
},
71+
},
72+
},
73+
};
74+
</script>
75+
76+
<template>
77+
<gl-badge v-if="showBadge" variant="success" icon="merge-request">
78+
{{ openMRsCountText }}
79+
</gl-badge>
80+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
query getOpenMrCountsForBlobPath(
2+
$projectPath: ID!
3+
$targetBranch: [String!]
4+
$blobPath: String!
5+
$createdAfter: Time!
6+
) {
7+
project(fullPath: $projectPath) {
8+
id
9+
mergeRequests(
10+
state: opened
11+
targetBranches: $targetBranch
12+
blobPath: $blobPath
13+
createdAfter: $createdAfter
14+
) {
15+
count
16+
}
17+
}
18+
}

app/assets/javascripts/vue_shared/components/notes/system_note.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export default {
107107
return this.getNoteableData.noteableType === 'MergeRequest';
108108
},
109109
iconBgClass() {
110-
return ICON_COLORS[this.note.system_note_icon_name] || 'gl-bg-strong gl-text-subtle';
110+
return ICON_COLORS[this.note.system_note_icon_name] || 'gl-text-subtle';
111111
},
112112
systemNoteIconName() {
113113
let icon = this.note.system_note_icon_name;
@@ -160,7 +160,7 @@ export default {
160160
iconBgClass,
161161
{
162162
'system-note-icon -gl-mt-1 gl-ml-2 gl-h-6 gl-w-6': isAllowedIcon,
163-
'system-note-dot -gl-top-1 gl-ml-4 gl-mt-3 gl-h-3 gl-w-3 gl-border-2 gl-border-solid gl-border-subtle gl-bg-gray-900':
163+
'system-note-dot -gl-top-1 gl-ml-4 gl-mt-3 gl-h-3 gl-w-3 gl-border-2 gl-border-solid gl-border-subtle':
164164
!isAllowedIcon,
165165
},
166166
]"

app/assets/javascripts/work_items/components/notes/system_note.vue

+12-5
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import { __ } from '~/locale';
2626
import NoteHeader from '~/notes/components/note_header.vue';
2727
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
2828
29-
const ALLOWED_ICONS = ['issue-close'];
3029
const ICON_COLORS = {
31-
'issue-close': '!gl-bg-blue-100 gl-text-blue-700 icon-info',
30+
'issue-close': 'system-note-icon-info',
31+
issues: 'system-note-icon-success',
3232
};
3333
3434
export default {
@@ -75,7 +75,7 @@ export default {
7575
return ICON_COLORS[this.note.systemNoteIconName] || '';
7676
},
7777
isAllowedIcon() {
78-
return ALLOWED_ICONS.includes(this.note.systemNoteIconName);
78+
return Object.keys(ICON_COLORS).includes(this.note.systemNoteIconName);
7979
},
8080
isTargetNote() {
8181
return this.targetNoteHash === this.noteAnchorId;
@@ -101,6 +101,13 @@ export default {
101101
deleteButtonClasses() {
102102
return this.singleLineDescription ? 'gl-top-5 gl-right-2 gl-mt-2' : 'gl-top-6 gl-right-3';
103103
},
104+
systemNoteIconName() {
105+
let icon = this.note.systemNoteIconName;
106+
if (this.note.systemNoteIconName === 'issues') {
107+
icon = 'issue-open-m';
108+
}
109+
return icon;
110+
},
104111
},
105112
mounted() {
106113
renderGFM(this.$refs['gfm-content']);
@@ -126,13 +133,13 @@ export default {
126133
getIconColor,
127134
{
128135
'system-note-icon -gl-mt-1 gl-ml-2 gl-h-6 gl-w-6': isAllowedIcon,
129-
'system-note-dot -gl-top-1 gl-ml-4 gl-mt-3 gl-h-3 gl-w-3 gl-border-2 gl-border-solid gl-border-subtle gl-bg-gray-900':
136+
'system-note-dot -gl-top-1 gl-ml-4 gl-mt-3 gl-h-3 gl-w-3 gl-border-2 gl-border-solid gl-border-subtle':
130137
!isAllowedIcon,
131138
},
132139
]"
133140
class="gl-relative gl-float-left gl-flex gl-items-center gl-justify-center gl-rounded-full"
134141
>
135-
<gl-icon v-if="isAllowedIcon" :size="14" :name="note.systemNoteIconName" />
142+
<gl-icon v-if="isAllowedIcon" :size="14" :name="systemNoteIconName" />
136143
</div>
137144
<div class="gl-ml-7">
138145
<div class="gl-flex gl-items-start gl-justify-between">

app/assets/stylesheets/framework/diffs.scss

+6-7
Original file line numberDiff line numberDiff line change
@@ -870,18 +870,17 @@ table.code {
870870
}
871871
}
872872

873-
.diff-file.linked-file .file-title {
874-
background-color: $blue-50;
875-
border-color: $blue-200;
876-
}
873+
.diff-file.linked-file {
874+
border-color: var(--blue-200);
877875

878-
.diff-file.linked-file .diff-content {
879-
border-color: $blue-200;
876+
.file-title {
877+
@apply gl-bg-feedback-info;
878+
}
880879
}
881880

882881
// This is not inside page_bundles because then it won't receive a proper color value for the dark theme
883882
.diff-file-row.is-active.is-linked {
884-
background-color: $blue-50;
883+
@apply gl-bg-feedback-info;
885884
}
886885

887886
.collapsed-file-warning {

app/assets/stylesheets/framework/files.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ span.idiff {
455455
// The virtual scroller has a flat HTML structure so instead of the ::before
456456
// element stretching over multiple rows we instead create a repeating background image
457457
// for the line
458-
background: repeating-linear-gradient(to right, var(--gray-100, $gray-100), var(--gray-100, $gray-100) 1px, transparent 1px, transparent 14px);
458+
background: repeating-linear-gradient(to right, var(--gl-border-color-default), var(--gl-border-color-default) 1px, transparent 1px, transparent 14px);
459459
background-size: calc(var(--level) * 14px) 100%;
460460
background-repeat: no-repeat;
461461
background-position: 14px;

app/assets/stylesheets/page_bundles/merge_requests.scss

+2-2
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,11 @@
364364
}
365365

366366
.diff-file-row.is-active {
367-
background-color: var(--gray-50, $gray-50);
367+
@apply gl-bg-strong;
368368
}
369369

370370
.diff-file-row.is-loading {
371-
color: var(--gl-text-color-disabled);
371+
@apply gl-text-disabled;
372372
}
373373

374374
.mr-info-list {

app/assets/stylesheets/page_bundles/notes/_system_notes.scss

+7-4
Original file line numberDiff line numberDiff line change
@@ -46,29 +46,32 @@
4646
}
4747
}
4848

49+
.system-note-dot {
50+
background-color: var(--gl-status-neutral-icon-color);
51+
}
4952

5053
// Vertical line gradient for specific system note icons
5154
.system-note-icon {
5255
color: var(--system-note-icon-color);
5356
background-color: var(--system-note-icon-background-color);
5457

5558
&.system-note-icon-success {
56-
--system-note-icon-color: var(--gl-status-success-text-color);
59+
--system-note-icon-color: var(--gl-status-success-icon-color);
5760
--system-note-icon-background-color: var(--gl-status-success-background-color);
5861
}
5962

6063
&.system-note-icon-danger {
61-
--system-note-icon-color: var(--gl-status-danger-text-color);
64+
--system-note-icon-color: var(--gl-status-danger-icon-color);
6265
--system-note-icon-background-color: var(--gl-status-danger-background-color);
6366
}
6467

6568
&.system-note-icon-info {
66-
--system-note-icon-color: var(--gl-status-info-text-color);
69+
--system-note-icon-color: var(--gl-status-info-icon-color);
6770
--system-note-icon-background-color: var(--gl-status-info-background-color);
6871
}
6972

7073
&.system-note-icon-warning {
71-
--system-note-icon-color: var(--gl-status-warning-text-color);
74+
--system-note-icon-color: var(--gl-status-warning-icon-color);
7275
--system-note-icon-background-color: var(--gl-status-warning-background-color);
7376
}
7477

app/controllers/projects/blob_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class Projects::BlobController < Projects::ApplicationController
4646
before_action do
4747
push_frontend_feature_flag(:inline_blame, @project)
4848
push_frontend_feature_flag(:blob_overflow_menu, current_user)
49+
push_frontend_feature_flag(:filter_blob_path, current_user)
4950
push_frontend_feature_flag(:blob_repository_vue_header_app, @project)
5051
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
5152
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)

app/controllers/projects/tree_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Projects::TreeController < Projects::ApplicationController
2121
push_frontend_feature_flag(:inline_blame, @project)
2222
push_frontend_feature_flag(:blob_repository_vue_header_app, @project)
2323
push_frontend_feature_flag(:blob_overflow_menu, current_user)
24+
push_frontend_feature_flag(:filter_blob_path, current_user)
2425
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
2526
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
2627
end

app/controllers/projects_controller.rb

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class ProjectsController < Projects::ApplicationController
4444
push_frontend_feature_flag(:page_specific_styles, current_user)
4545
push_frontend_feature_flag(:blob_repository_vue_header_app, @project)
4646
push_frontend_feature_flag(:blob_overflow_menu, current_user)
47+
push_frontend_feature_flag(:filter_blob_path, current_user)
4748
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
4849
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
4950

app/graphql/resolvers/groups_resolver.rb

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ class GroupsResolver < BaseResolver
3232
"for example: `id_desc` or `name_asc`",
3333
default_value: 'name_asc'
3434

35+
argument :all_available, GraphQL::Types::Boolean,
36+
required: false,
37+
default_value: true,
38+
replace_null_with_default: true,
39+
description: <<~DESC
40+
When `true`, returns all accessible groups. When `false`, returns only groups where the user is a member.
41+
Unauthenticated requests always return all public groups. The `owned_only` argument takes precedence.
42+
DESC
43+
3544
private
3645

3746
def resolve_groups(**args)

app/models/ci/job_token/scope.rb

+15-3
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,18 @@ def accessible?(accessed_project)
3636

3737
def policies_allowed?(accessed_project, policies)
3838
return true if self_referential?(accessed_project)
39+
40+
unless accessed_project.ci_inbound_job_token_scope_enabled?
41+
# We capture policies even if the inbound scopes are disabled
42+
capture_job_token_policies(policies)
43+
return true
44+
end
45+
3946
return false unless inbound_accessible?(accessed_project)
4047

41-
# We capture policies even if the inbound scopes are disabled or the feature flag is disabled
42-
Ci::JobToken::Authorization.capture_job_token_policies(policies) if policies.present?
48+
# We capture policies even if the feature flag is disabled
49+
capture_job_token_policies(policies)
4350

44-
return true unless accessed_project.ci_inbound_job_token_scope_enabled?
4551
return true unless Feature.enabled?(:add_policies_to_ci_job_token, accessed_project)
4652

4753
policies_allowed_for_accessed_project?(accessed_project, policies)
@@ -140,6 +146,12 @@ def inbound_allowlist
140146
def outbound_allowlist
141147
Ci::JobToken::Allowlist.new(current_project, direction: :outbound)
142148
end
149+
150+
def capture_job_token_policies(policies)
151+
return if policies.blank?
152+
153+
Ci::JobToken::Authorization.capture_job_token_policies(policies)
154+
end
143155
end
144156
end
145157
end

app/services/merge_requests/base_service.rb

+5-8
Original file line numberDiff line numberDiff line change
@@ -233,17 +233,14 @@ def create_reviewer_note(merge_request, old_reviewers)
233233

234234
def create_pipeline_for(merge_request, user, async: false, allow_duplicate: false)
235235
create_pipeline_params = params.slice(:push_options).merge(allow_duplicate: allow_duplicate)
236+
service = MergeRequests::CreatePipelineService.new(
237+
project: project, current_user: user, params: create_pipeline_params
238+
)
236239

237240
if async
238-
MergeRequests::CreatePipelineWorker.perform_async(
239-
project.id,
240-
user.id,
241-
merge_request.id,
242-
create_pipeline_params.deep_stringify_keys)
241+
service.execute_async(merge_request)
243242
else
244-
MergeRequests::CreatePipelineService
245-
.new(project: project, current_user: user, params: create_pipeline_params)
246-
.execute(merge_request)
243+
service.execute(merge_request)
247244
end
248245
end
249246

app/services/merge_requests/create_pipeline_service.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def execute_async(merge_request)
1717

1818
::MergeRequests::CreatePipelineWorker.perform_async(
1919
project.id, current_user.id, merge_request.id,
20-
params.merge(pipeline_creation_request: pipeline_creation_request)
20+
params.merge(pipeline_creation_request: pipeline_creation_request).deep_stringify_keys
2121
)
2222
end
2323

0 commit comments

Comments
 (0)