Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2024-01-23 18:08:36 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2024-01-23 18:08:36 +0300
commit118083ac69c8cba0bc60633a15b9bb44e5f78281 (patch)
tree1e00c72fa30c952c9a8d86b3441132f037b3fc21 /app
parent84b507d17bad7636a02ae2e9f59e8eb219ad7e15 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/members/components/avatars/user_avatar.vue1
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue9
-rw-r--r--app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql1
-rw-r--r--app/assets/javascripts/user_popovers.js3
-rw-r--r--app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue4
-rw-r--r--app/assets/javascripts/work_items/components/work_item_assignees_with_edit.vue10
-rw-r--r--app/graphql/types/projects/branch_rule_type.rb4
-rw-r--r--app/models/commit.rb4
-rw-r--r--app/models/container_registry/protection/rule.rb4
-rw-r--r--app/models/merge_request.rb33
-rw-r--r--app/services/import/github_service.rb26
-rw-r--r--app/views/devise/shared/_footer.html.haml2
-rw-r--r--app/views/projects/merge_requests/_page.html.haml4
-rw-r--r--app/views/projects/merge_requests/widget/_commit_change_content.html.haml4
14 files changed, 58 insertions, 51 deletions
diff --git a/app/assets/javascripts/members/components/avatars/user_avatar.vue b/app/assets/javascripts/members/components/avatars/user_avatar.vue
index 4260ee14a14..656d9b61cb6 100644
--- a/app/assets/javascripts/members/components/avatars/user_avatar.vue
+++ b/app/assets/javascripts/members/components/avatars/user_avatar.vue
@@ -65,6 +65,7 @@ export default {
:href="user.webUrl"
:data-user-id="user.id"
:data-username="user.username"
+ :data-email="user.email"
>
<gl-avatar-labeled
:label="user.name"
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
index 3796c5440f7..9fbc22f2312 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list_row.vue
@@ -104,11 +104,14 @@ export default {
// remove sha256: from the string, and show only the first 7 char
return this.tag.digest?.substring(7, 14) ?? NOT_AVAILABLE_TEXT;
},
+ publishDate() {
+ return this.tag.publishedAt || this.tag.createdAt;
+ },
publishedDate() {
- return formatDate(this.tag.createdAt, 'isoDate');
+ return formatDate(this.publishDate, 'isoDate');
},
publishedTime() {
- return formatDate(this.tag.createdAt, 'HH:MM:ss Z');
+ return formatDate(this.publishDate, 'HH:MM:ss Z');
},
formattedRevision() {
// to be removed when API response is adjusted
@@ -182,7 +185,7 @@ export default {
<span data-testid="time">
<gl-sprintf :message="$options.i18n.CREATED_AT_LABEL">
<template #timeInfo>
- <time-ago-tooltip :time="tag.createdAt" />
+ <time-ago-tooltip :time="publishDate" />
</template>
</gl-sprintf>
</span>
diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
index a0a80600603..0c70a443fdc 100644
--- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
+++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/graphql/queries/get_container_repository_tags.query.graphql
@@ -22,6 +22,7 @@ query getContainerRepositoryTags(
revision
shortRevision
createdAt
+ publishedAt
totalSize
canDelete
}
diff --git a/app/assets/javascripts/user_popovers.js b/app/assets/javascripts/user_popovers.js
index ee5d6a22fc3..90c5e89a0b5 100644
--- a/app/assets/javascripts/user_popovers.js
+++ b/app/assets/javascripts/user_popovers.js
@@ -13,13 +13,14 @@ const removeTitle = (el) => {
const getPreloadedUserInfo = (dataset) => {
const userId = dataset.user || dataset.userId;
- const { username, name, avatarUrl } = dataset;
+ const { username, name, avatarUrl, email } = dataset;
return {
userId,
username,
name,
avatarUrl,
+ email,
};
};
diff --git a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
index 30f616dd8e1..e53e81ec98e 100644
--- a/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
+++ b/app/assets/javascripts/vue_shared/components/user_popover/user_popover.vue
@@ -267,6 +267,10 @@ export default {
<template v-else>
<template v-if="!isBlocked">
<div class="gl-text-gray-500">
+ <div v-if="user.email" class="gl-display-flex gl-mb-2">
+ <gl-icon name="mail" class="gl-flex-shrink-0" />
+ <span ref="email" class="gl-ml-2">{{ user.email }}</span>
+ </div>
<div v-if="user.bio" class="gl-display-flex gl-mb-2">
<gl-icon name="profile" class="gl-flex-shrink-0" />
<span ref="bio" class="gl-ml-2">{{ user.bio }}</span>
diff --git a/app/assets/javascripts/work_items/components/work_item_assignees_with_edit.vue b/app/assets/javascripts/work_items/components/work_item_assignees_with_edit.vue
index bb7baed29f6..29c7e0032ef 100644
--- a/app/assets/javascripts/work_items/components/work_item_assignees_with_edit.vue
+++ b/app/assets/javascripts/work_items/components/work_item_assignees_with_edit.vue
@@ -1,6 +1,6 @@
<script>
import { GlButton } from '@gitlab/ui';
-import { isEmpty } from 'lodash';
+import { unionBy } from 'lodash';
import currentUserQuery from '~/graphql_shared/queries/current_user.query.graphql';
import groupUsersSearchQuery from '~/graphql_shared/queries/group_users_search.query.graphql';
import usersSearchQuery from '~/graphql_shared/queries/users_search.query.graphql';
@@ -139,12 +139,10 @@ export default {
return this.allowsMultipleAssignees ? __('Select assignees') : __('Select assignee');
},
filteredAssignees() {
- return isEmpty(this.searchUsers)
- ? this.assignees
- : this.searchUsers.filter(({ id }) => this.localAssigneeIds.includes(id));
+ return unionBy(this.assignees, this.searchUsers, 'id');
},
localAssignees() {
- return this.filteredAssignees || [];
+ return this.filteredAssignees.filter(({ id }) => this.localAssigneeIds.includes(id)) || [];
},
},
watch: {
@@ -238,7 +236,7 @@ export default {
:dropdown-label="dropdownLabel"
:can-update="canUpdate"
dropdown-name="assignees"
- show-footer
+ :show-footer="canInviteMembers"
:infinite-scroll="hasNextPage"
:infinite-scroll-loading="isLoadingMore"
:loading="isLoadingUsers"
diff --git a/app/graphql/types/projects/branch_rule_type.rb b/app/graphql/types/projects/branch_rule_type.rb
index 08b1203d4a3..f8ea3644945 100644
--- a/app/graphql/types/projects/branch_rule_type.rb
+++ b/app/graphql/types/projects/branch_rule_type.rb
@@ -4,7 +4,7 @@ module Types
module Projects
class BranchRuleType < BaseObject
graphql_name 'BranchRule'
- description 'List of branch rules for a project, grouped by branch name.'
+ description 'Branch rules configured for a rule target.'
authorize :read_protected_branch
alias_method :branch_rule, :object
@@ -12,7 +12,7 @@ module Types
field :name,
type: GraphQL::Types::String,
null: false,
- description: 'Branch name, with wildcards, for the branch rules.'
+ description: 'Name of the branch rule target. Includes wildcards.'
field :is_default,
type: GraphQL::Types::Boolean,
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 312b1b3f70f..eca984f48fa 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -639,6 +639,8 @@ class Commit
end
def merged_merge_request_no_cache(user)
- MergeRequestsFinder.new(user, project_id: project_id).find_by(merge_commit_sha: id) if merge_commit?
+ return MergeRequestsFinder.new(user, project_id: project_id).find_by(merge_commit_sha: id) if merge_commit?
+
+ MergeRequestsFinder.new(user, project_id: project_id).find_by(squash_commit_sha: id)
end
end
diff --git a/app/models/container_registry/protection/rule.rb b/app/models/container_registry/protection/rule.rb
index 34d00bdef2f..6a3c79ee046 100644
--- a/app/models/container_registry/protection/rule.rb
+++ b/app/models/container_registry/protection/rule.rb
@@ -3,10 +3,6 @@
module ContainerRegistry
module Protection
class Rule < ApplicationRecord
- include IgnorableColumns
-
- ignore_column :container_path_pattern, remove_with: '16.8', remove_after: '2023-12-22'
-
enum delete_protected_up_to_access_level:
Gitlab::Access.sym_options_with_owner.slice(:maintainer, :owner, :developer),
_prefix: :delete_protected_up_to
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index ae68a36c8d2..39b147cfd3f 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -1905,6 +1905,10 @@ class MergeRequest < ApplicationRecord
@merge_commit ||= project.commit(merge_commit_sha) if merge_commit_sha
end
+ def squash_commit
+ @squash_commit ||= project.commit(squash_commit_sha) if squash_commit_sha
+ end
+
def short_merge_commit_sha
Commit.truncate_sha(merge_commit_sha) if merge_commit_sha
end
@@ -1922,10 +1926,33 @@ class MergeRequest < ApplicationRecord
end
end
+ # Exists only for merged merge requests
+ def commit_to_revert
+ return unless merged?
+
+ # By default, it's equal to a merge commit
+ return merge_commit if merge_commit
+
+ # But in case of fast-forward merge merge commits are not created
+ # To solve that we can use `squash_commit` if the merge request was squashed
+ return squash_commit if squash_commit
+
+ # Edge case: one commit in the merge request without merge or squash commit
+ return project.commit(diff_head_sha) if commits_count == 1
+
+ nil
+ end
+
+ def commit_to_cherry_pick
+ commit_to_revert
+ end
+
def can_be_reverted?(current_user)
- return false unless merge_commit
return false unless merged_at
+ commit = commit_to_revert
+ return false unless commit
+
# It is not guaranteed that Note#created_at will be strictly later than
# MergeRequestMetric#merged_at. Nanoseconds on MySQL may break this
# comparison, as will a HA environment if clocks are not *precisely*
@@ -1934,7 +1961,7 @@ class MergeRequest < ApplicationRecord
notes_association = notes_with_associations.where('created_at >= ?', cutoff)
- !merge_commit.has_been_reverted?(current_user, notes_association)
+ !commit.has_been_reverted?(current_user, notes_association)
end
def merged_at
@@ -1949,7 +1976,7 @@ class MergeRequest < ApplicationRecord
end
def can_be_cherry_picked?
- merge_commit.present?
+ commit_to_cherry_pick.present?
end
def has_complete_diff_refs?
diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb
index 92a91740304..b8389192b18 100644
--- a/app/services/import/github_service.rb
+++ b/app/services/import/github_service.rb
@@ -5,9 +5,6 @@ module Import
include ActiveSupport::NumberHelper
include Gitlab::Utils::StrongMemoize
- MINIMUM_IMPORT_SCOPE = %w[repo].freeze
- COLLAB_IMPORT_SCOPES = %w[admin:org read:org].freeze
-
attr_accessor :client
attr_reader :params, :current_user
@@ -15,9 +12,6 @@ module Import
context_error = validate_context
return context_error if context_error
- scope_error = validate_scopes
- return scope_error if scope_error
-
project = create_project(access_params, provider)
track_access_level('github')
@@ -104,26 +98,6 @@ module Import
private
- def validate_scopes
- # We need to call `#repo` to ensure the `#last_response` from the client has the headers we need.
- repo
- scopes = client.octokit.last_response.headers["x-oauth-scopes"]
- scopes = scopes.split(',').map(&:strip)
-
- unless scopes.intersect?(MINIMUM_IMPORT_SCOPE + COLLAB_IMPORT_SCOPES)
- return log_and_return_error('Invalid Scope', _('Your GitHub access token does not have the correct scope to import.'), :unprocessable_entity)
- end
-
- collaborators_import = params.dig(:optional_stages, :collaborators_import)
- # A value for `collaborators_import` may not be included in POST params
- # and the default value is `true`
- return unless collaborators_import == true || collaborators_import.nil?
-
- return if scopes.intersect?(COLLAB_IMPORT_SCOPES)
-
- log_and_return_error('Invalid scope', _('Your GitHub access token does not have the correct scope to import collaborators.'), :unprocessable_entity)
- end
-
def validate_context
if blocked_url?
log_and_return_error("Invalid URL: #{url}", _("Invalid URL: %{url}") % { url: url }, :bad_request)
diff --git a/app/views/devise/shared/_footer.html.haml b/app/views/devise/shared/_footer.html.haml
index a8c45566d63..44c99a828d7 100644
--- a/app/views/devise/shared/_footer.html.haml
+++ b/app/views/devise/shared/_footer.html.haml
@@ -1,7 +1,7 @@
.footer-container.gl-w-full.gl-align-self-end
%hr.gl-m-0
.container.gl-py-5.gl-display-flex.gl-justify-content-space-between.gl-align-items-flex-start
- .gl-display-flex.gl-gap-5.gl-flex-wrap
+ .gl-display-none.gl-md-display-flex.gl-gap-5.gl-flex-wrap
- unless public_visibility_restricted?
= link_to _("Explore"), explore_root_path
= link_to _("Help"), help_path
diff --git a/app/views/projects/merge_requests/_page.html.haml b/app/views/projects/merge_requests/_page.html.haml
index 35eb9d2850d..7cfd102799c 100644
--- a/app/views/projects/merge_requests/_page.html.haml
+++ b/app/views/projects/merge_requests/_page.html.haml
@@ -109,9 +109,9 @@
= render 'shared/issuable/sidebar', issuable_sidebar: @issuable_sidebar, assignees: @merge_request.assignees, reviewers: @merge_request.reviewers, source_branch: @merge_request.source_branch
- if @merge_request.can_be_reverted?(current_user)
- = render "projects/commit/change", type: 'revert', commit: @merge_request.merge_commit
+ = render "projects/commit/change", type: 'revert', commit: @merge_request.commit_to_revert
- if @merge_request.can_be_cherry_picked?
- = render "projects/commit/change", type: 'cherry-pick', commit: @merge_request.merge_commit
+ = render "projects/commit/change", type: 'cherry-pick', commit: @merge_request.commit_to_cherry_pick
#js-review-bar{ data: review_bar_data(@merge_request, current_user) }
diff --git a/app/views/projects/merge_requests/widget/_commit_change_content.html.haml b/app/views/projects/merge_requests/widget/_commit_change_content.html.haml
index 572d9e7578c..58357d6147c 100644
--- a/app/views/projects/merge_requests/widget/_commit_change_content.html.haml
+++ b/app/views/projects/merge_requests/widget/_commit_change_content.html.haml
@@ -1,4 +1,4 @@
- if @merge_request.can_be_reverted?(current_user)
- = render "projects/commit/change", type: 'revert', commit: @merge_request.merge_commit
+ = render "projects/commit/change", type: 'revert', commit: @merge_request.commit_to_revert
- if @merge_request.can_be_cherry_picked?
- = render "projects/commit/change", type: 'cherry-pick', commit: @merge_request.merge_commit
+ = render "projects/commit/change", type: 'cherry-pick', commit: @merge_request.commit_to_cherry_pick