diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/projects/blame_controller.rb | 5 | ||||
-rw-r--r-- | app/controllers/projects/merge_requests/diffs_controller.rb | 15 | ||||
-rw-r--r-- | app/controllers/projects/merge_requests/drafts_controller.rb | 8 | ||||
-rw-r--r-- | app/helpers/blob_helper.rb | 26 | ||||
-rw-r--r-- | app/models/concerns/counter_attribute.rb | 6 | ||||
-rw-r--r-- | app/models/project_statistics.rb | 34 | ||||
-rw-r--r-- | app/policies/packages/policies/project_policy.rb | 23 | ||||
-rw-r--r-- | app/services/projects/blame_service.rb | 17 | ||||
-rw-r--r-- | app/services/projects/create_service.rb | 15 | ||||
-rw-r--r-- | app/views/projects/blame/show.html.haml | 16 | ||||
-rw-r--r-- | app/views/projects/blob/_header.html.haml | 6 | ||||
-rw-r--r-- | app/workers/flush_counter_increments_worker.rb | 1 |
12 files changed, 90 insertions, 82 deletions
diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb index 5bfda526fb0..2a20c67a23d 100644 --- a/app/controllers/projects/blame_controller.rb +++ b/app/controllers/projects/blame_controller.rb @@ -23,11 +23,10 @@ class Projects::BlameController < Projects::ApplicationController environment_params[:find_latest] = true @environment = ::Environments::EnvironmentsByDeploymentsFinder.new(@project, current_user, environment_params).execute.last - blame_service = Projects::BlameService.new(@blob, @commit, params.permit(:page)) + blame_service = Projects::BlameService.new(@blob, @commit, params.permit(:page, :no_pagination)) @blame = Gitlab::View::Presenter::Factory.new(blame_service.blame, project: @project, path: @path, page: blame_service.page).fabricate! - - render locals: { blame_pagination: blame_service.pagination } + @blame_pagination = blame_service.pagination end end diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb index f04412d7603..a68c2ffa06d 100644 --- a/app/controllers/projects/merge_requests/diffs_controller.rb +++ b/app/controllers/projects/merge_requests/diffs_controller.rb @@ -64,20 +64,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic return unless stale?(etag: [cache_context + diff_options_hash.fetch(:paths, []), diffs]) - if diff_options_hash[:paths].blank? - if Feature.enabled?(:remove_caching_diff_batches, @merge_request.project) - render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options) - else - render_cached( - diffs, - with: PaginatedDiffSerializer.new(current_user: current_user), - cache_context: -> (_) { [Digest::SHA256.hexdigest(cache_context.to_s)] }, - **options - ) - end - else - render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options) - end + render json: PaginatedDiffSerializer.new(current_user: current_user).represent(diffs, options) end # rubocop: enable Metrics/AbcSize diff --git a/app/controllers/projects/merge_requests/drafts_controller.rb b/app/controllers/projects/merge_requests/drafts_controller.rb index c75c3099051..74bb3ad1a63 100644 --- a/app/controllers/projects/merge_requests/drafts_controller.rb +++ b/app/controllers/projects/merge_requests/drafts_controller.rb @@ -57,10 +57,12 @@ class Projects::MergeRequests::DraftsController < Projects::MergeRequests::Appli end if Gitlab::Utils.to_boolean(approve_params[:approve]) - success = ::MergeRequests::ApprovalService.new(project: @project, current_user: current_user, params: approve_params).execute(merge_request) + unless merge_request.approved_by?(current_user) + success = ::MergeRequests::ApprovalService.new(project: @project, current_user: current_user, params: approve_params).execute(merge_request) - unless success - return render json: { message: _('An error occurred while approving, please try again.') }, status: :internal_server_error + unless success + return render json: { message: _('An error occurred while approving, please try again.') }, status: :internal_server_error + end end merge_request_activity_counter.track_submit_review_approve(user: current_user) diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 2c84da4862a..6c09e15f56f 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -92,32 +92,6 @@ module BlobHelper end end - def replace_blob_link(project = @project, ref = @ref, path = @path, blob:) - modify_file_button( - project, - ref, - path, - blob: blob, - label: _("Replace"), - action: "replace", - btn_class: "default", - modal_type: "upload" - ) - end - - def delete_blob_link(project = @project, ref = @ref, path = @path, blob:) - modify_file_button( - project, - ref, - path, - blob: blob, - label: _("Delete"), - action: "delete", - btn_class: "default", - modal_type: "remove" - ) - end - def can_modify_blob?(blob, project = @project, ref = @ref) !blob.stored_externally? && can_edit_tree?(project, ref) end diff --git a/app/models/concerns/counter_attribute.rb b/app/models/concerns/counter_attribute.rb index 65cf3246d11..08c098384b5 100644 --- a/app/models/concerns/counter_attribute.rb +++ b/app/models/concerns/counter_attribute.rb @@ -65,6 +65,10 @@ module CounterAttribute def counter_attribute_after_flush(&callback) after_flush_callbacks << callback end + + def counter_attribute_enabled?(attribute) + counter_attributes.include?(attribute) + end end # This method must only be called by FlushCounterIncrementsWorker @@ -157,7 +161,7 @@ module CounterAttribute end def counter_attribute_enabled?(attribute) - self.class.counter_attributes.include?(attribute) + self.class.counter_attribute_enabled?(attribute) end private diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb index a0af1b47d01..a91e0291438 100644 --- a/app/models/project_statistics.rb +++ b/app/models/project_statistics.rb @@ -11,9 +11,10 @@ class ProjectStatistics < ApplicationRecord default_value_for :snippets_size, 0 counter_attribute :build_artifacts_size - counter_attribute :storage_size counter_attribute_after_flush do |project_statistic| + project_statistic.refresh_storage_size! + Namespaces::ScheduleAggregationWorker.perform_async(project_statistic.namespace_id) end @@ -21,7 +22,6 @@ class ProjectStatistics < ApplicationRecord COLUMNS_TO_REFRESH = [:repository_size, :wiki_size, :lfs_objects_size, :commit_count, :snippets_size, :uploads_size, :container_registry_size].freeze INCREMENTABLE_COLUMNS = { - build_artifacts_size: %i[storage_size], packages_size: %i[storage_size], pipeline_artifacts_size: %i[storage_size], snippets_size: %i[storage_size] @@ -109,21 +109,25 @@ class ProjectStatistics < ApplicationRecord self.storage_size = storage_size end - # Since this incremental update method does not call update_storage_size above, - # we have to update the storage_size here as additional column. - # Additional columns are updated depending on key => [columns], which allows - # to update statistics which are and also those which aren't included in storage_size - # or any other additional summary column in the future. + def refresh_storage_size! + update_storage_size + save! + end + + # Since this incremental update method does not call update_storage_size above through before_save, + # we have to update the storage_size separately. + # + # For counter attributes, storage_size will be refreshed after the counter is flushed, + # through counter_attribute_after_flush + # + # For non-counter attributes, storage_size is updated depending on key => [columns] in INCREMENTABLE_COLUMNS def self.increment_statistic(project, key, amount) - raise ArgumentError, "Cannot increment attribute: #{key}" unless INCREMENTABLE_COLUMNS.key?(key) + raise ArgumentError, "Cannot increment attribute: #{key}" unless incrementable_attribute?(key) return if amount == 0 project.statistics.try do |project_statistics| - if project_statistics.counter_attribute_enabled?(key) - statistics_to_increment = [key] + INCREMENTABLE_COLUMNS[key].to_a - statistics_to_increment.each do |statistic| - project_statistics.delayed_increment_counter(statistic, amount) - end + if counter_attribute_enabled?(key) + project_statistics.delayed_increment_counter(key, amount) else legacy_increment_statistic(project, key, amount) end @@ -149,6 +153,10 @@ class ProjectStatistics < ApplicationRecord update_all(updates.join(', ')) end + def self.incrementable_attribute?(key) + INCREMENTABLE_COLUMNS.key?(key) || counter_attribute_enabled?(key) + end + private def schedule_namespace_aggregation_worker diff --git a/app/policies/packages/policies/project_policy.rb b/app/policies/packages/policies/project_policy.rb index 8e05165c00d..c754d24349a 100644 --- a/app/policies/packages/policies/project_policy.rb +++ b/app/policies/packages/policies/project_policy.rb @@ -7,9 +7,24 @@ module Packages overrides(:read_package) - rule { anonymous & ~project.public_project }.prevent_all + condition(:package_registry_access_level_feature_flag_enabled, scope: :subject) do + ::Feature.enabled?(:package_registry_access_level, @subject) + end + + condition(:packages_enabled_for_everyone, scope: :subject) do + @subject.package_registry_access_level == ProjectFeature::PUBLIC + end + + # This rule can be removed if the `package_registry_access_level` feature flag is removed. + # Reason: If the feature flag is globally enabled, this rule will never be executed. + rule { anonymous & ~project.public_project & ~package_registry_access_level_feature_flag_enabled }.prevent_all - rule { ~project.public_project & ~project.internal_access & ~project.project_allowed_for_job_token }.prevent_all + # This rule can be removed if the `package_registry_access_level` feature flag is removed. + # Reason: If the feature flag is globally enabled, this rule will never be executed. + rule do + ~project.public_project & ~project.internal_access & + ~project.project_allowed_for_job_token & ~package_registry_access_level_feature_flag_enabled + end.prevent_all rule { project.packages_disabled }.policy do prevent(:read_package) @@ -30,6 +45,10 @@ module Packages rule { project.write_package_registry_deploy_token }.policy do enable :read_package end + + rule { package_registry_access_level_feature_flag_enabled & packages_enabled_for_everyone }.policy do + enable :read_package + end end end end diff --git a/app/services/projects/blame_service.rb b/app/services/projects/blame_service.rb index b324ea27360..57b913b04e6 100644 --- a/app/services/projects/blame_service.rb +++ b/app/services/projects/blame_service.rb @@ -10,6 +10,7 @@ module Projects @blob = blob @commit = commit @page = extract_page(params) + @pagination_enabled = pagination_state(params) end attr_reader :page @@ -19,7 +20,7 @@ module Projects end def pagination - return unless pagination_enabled? + return unless pagination_enabled Kaminari.paginate_array([], total_count: blob_lines_count, limit: per_page) .tap { |pagination| pagination.max_paginates_per(per_page) } @@ -28,10 +29,10 @@ module Projects private - attr_reader :blob, :commit + attr_reader :blob, :commit, :pagination_enabled def blame_range - return unless pagination_enabled? + return unless pagination_enabled first_line = (page - 1) * per_page + 1 last_line = (first_line + per_page).to_i - 1 @@ -51,6 +52,12 @@ module Projects PER_PAGE end + def pagination_state(params) + return false if Gitlab::Utils.to_boolean(params[:no_pagination], default: false) + + Feature.enabled?(:blame_page_pagination, commit.project) + end + def overlimit?(page) page * per_page >= blob_lines_count + per_page end @@ -58,9 +65,5 @@ module Projects def blob_lines_count @blob_lines_count ||= blob.data.lines.count end - - def pagination_enabled? - Feature.enabled?(:blame_page_pagination, commit.project) - end end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 9f52dd89ff2..c72f9b4b602 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -158,14 +158,25 @@ module Projects priority: UserProjectAccessChangedService::LOW_PRIORITY ) else - @project.add_owner(@project.namespace.owner, current_user: current_user) + owner_user = @project.namespace.owner + owner_member = @project.add_owner(owner_user, current_user: current_user) + + # There is a possibility that the sidekiq job to refresh the authorizations of the owner_user in this project + # isn't picked up (or finished) by the time the user is redirected to the newly created project's page. + # If that happens, the user will hit a 404. To avoid that scenario, we manually create a `project_authorizations` record for the user here. + if owner_member.persisted? + owner_user.project_authorizations.safe_find_or_create_by( + project: @project, + access_level: ProjectMember::OWNER + ) + end # During the process of adding a project owner, a check on permissions is made on the user which caches # the max member access for that user on this project. # Since that is `0` before the member is created - and we are still inside the request # cycle when we need to do other operations that might check those permissions (e.g. write a commit) # we need to purge that cache so that the updated permissions is fetched instead of using the outdated cached value of 0 # from before member creation - @project.team.purge_member_access_cache_for_user_id(@project.namespace.owner.id) + @project.team.purge_member_access_cache_for_user_id(owner_user.id) end end diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index b44c773adff..d4efca668eb 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -1,9 +1,9 @@ - page_title _("Blame"), @blob.path, @ref -#blob-content-holder.tree-holder +#blob-content-holder.tree-holder{ data: { testid: 'blob-content-holder' } } = render "projects/blob/breadcrumb", blob: @blob, blame: true - .file-holder + .file-holder.gl-overflow-hidden = render "projects/blob/header", blob: @blob, blame: true .file-blame-legend @@ -20,7 +20,7 @@ %span.legend-box.legend-box-9 %span.right-label Older - .table-responsive.file-content.blame.code{ class: user_color_scheme, data: { qa_selector: 'blame_file_content' } } + .table-responsive.file-content.blame.code{ class: "#{user_color_scheme} gl-rounded-0!", data: { qa_selector: 'blame_file_content' } } %table - current_line = @blame.first_line - @blame.groups.each do |blame_group| @@ -59,5 +59,11 @@ - current_line += line_count - - if blame_pagination - = paginate(blame_pagination, theme: "gitlab") + - if @blame_pagination + .gl-display-flex.gl-justify-content-center.gl-flex-direction-column.gl-align-items-center.gl-p-3.gl-bg-gray-50.gl-border-t-solid.gl-border-t-1.gl-border-gray-100 + = _('For faster browsing, not all history is shown.') + = render Pajamas::ButtonComponent.new(href: namespace_project_blame_path(namespace_id: @project.namespace, project_id: @project, id: @id, no_pagination: true), size: :small, button_options: { class: 'gl-mt-3' }) do |c| + = _('View entire blame') + + - if @blame_pagination + = paginate(@blame_pagination, theme: "gitlab") diff --git a/app/views/projects/blob/_header.html.haml b/app/views/projects/blob/_header.html.haml index e141a006415..9c07713b9f8 100644 --- a/app/views/projects/blob/_header.html.haml +++ b/app/views/projects/blob/_header.html.haml @@ -6,12 +6,6 @@ .file-actions.gl-display-flex.gl-align-items-center.gl-flex-wrap.gl-md-justify-content-end< = render 'projects/blob/viewer_switcher', blob: blob unless blame = render 'shared/web_ide_button', blob: blob - - unless blame - .btn-group{ role: "group", class: ("gl-ml-3" if current_user) }> - = render_if_exists 'projects/blob/header_file_locks_link' - - if current_user - = replace_blob_link(@project, @ref, @path, blob: blob) - = delete_blob_link(@project, @ref, @path, blob: blob) .btn-group.gl-ml-3{ role: "group" } = copy_blob_source_button(blob) unless blame = open_raw_blob_button(blob) diff --git a/app/workers/flush_counter_increments_worker.rb b/app/workers/flush_counter_increments_worker.rb index e21a7ee35e7..8c7e17587d0 100644 --- a/app/workers/flush_counter_increments_worker.rb +++ b/app/workers/flush_counter_increments_worker.rb @@ -11,6 +11,7 @@ class FlushCounterIncrementsWorker data_consistency :always sidekiq_options retry: 3 + loggable_arguments 0, 2 # The increments in `ProjectStatistics` are owned by several teams depending # on the counter |