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:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects/blame_controller.rb5
-rw-r--r--app/controllers/projects/merge_requests/diffs_controller.rb15
-rw-r--r--app/controllers/projects/merge_requests/drafts_controller.rb8
-rw-r--r--app/helpers/blob_helper.rb26
-rw-r--r--app/models/concerns/counter_attribute.rb6
-rw-r--r--app/models/project_statistics.rb34
-rw-r--r--app/policies/packages/policies/project_policy.rb23
-rw-r--r--app/services/projects/blame_service.rb17
-rw-r--r--app/services/projects/create_service.rb15
-rw-r--r--app/views/projects/blame/show.html.haml16
-rw-r--r--app/views/projects/blob/_header.html.haml6
-rw-r--r--app/workers/flush_counter_increments_worker.rb1
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