diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-23 18:08:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-23 18:08:36 +0300 |
commit | 118083ac69c8cba0bc60633a15b9bb44e5f78281 (patch) | |
tree | 1e00c72fa30c952c9a8d86b3441132f037b3fc21 /app | |
parent | 84b507d17bad7636a02ae2e9f59e8eb219ad7e15 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
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 |