diff options
Diffstat (limited to 'lib/gitlab/git')
-rw-r--r-- | lib/gitlab/git/diff.rb | 12 | ||||
-rw-r--r-- | lib/gitlab/git/diff_collection.rb | 34 | ||||
-rw-r--r-- | lib/gitlab/git/diff_stats_collection.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/git/repository.rb | 19 | ||||
-rw-r--r-- | lib/gitlab/git/wiki.rb | 10 |
5 files changed, 50 insertions, 29 deletions
diff --git a/lib/gitlab/git/diff.rb b/lib/gitlab/git/diff.rb index 09a49b6c1ca..78c47023c08 100644 --- a/lib/gitlab/git/diff.rb +++ b/lib/gitlab/git/diff.rb @@ -120,8 +120,8 @@ module Gitlab # default. # # Patches surpassing this limit should still be persisted in the database. - def patch_safe_limit_bytes - patch_hard_limit_bytes / 10 + def patch_safe_limit_bytes(limit = patch_hard_limit_bytes) + limit / 10 end # Returns the limit for a single diff file (patch). @@ -174,9 +174,13 @@ module Gitlab @line_count ||= Util.count_lines(@diff) end + def diff_bytesize + @diff_bytesize ||= @diff.bytesize + end + def too_large? if @too_large.nil? - @too_large = @diff.bytesize >= self.class.patch_hard_limit_bytes + @too_large = diff_bytesize >= self.class.patch_hard_limit_bytes else @too_large end @@ -194,7 +198,7 @@ module Gitlab def collapsed? return @collapsed if defined?(@collapsed) - @collapsed = !expanded && @diff.bytesize >= self.class.patch_safe_limit_bytes + @collapsed = !expanded && diff_bytesize >= self.class.patch_safe_limit_bytes end def collapse! diff --git a/lib/gitlab/git/diff_collection.rb b/lib/gitlab/git/diff_collection.rb index e6121d688ba..6090d1b9f69 100644 --- a/lib/gitlab/git/diff_collection.rb +++ b/lib/gitlab/git/diff_collection.rb @@ -7,19 +7,27 @@ module Gitlab class DiffCollection include Enumerable - DEFAULT_LIMITS = { max_files: 100, max_lines: 5000 }.freeze - attr_reader :limits delegate :max_files, :max_lines, :max_bytes, :safe_max_files, :safe_max_lines, :safe_max_bytes, to: :limits + def self.default_limits(project: nil) + if Feature.enabled?(:increased_diff_limits, project) + { max_files: 200, max_lines: 7500 } + else + { max_files: 100, max_lines: 5000 } + end + end + def self.limits(options = {}) limits = {} - limits[:max_files] = options.fetch(:max_files, DEFAULT_LIMITS[:max_files]) - limits[:max_lines] = options.fetch(:max_lines, DEFAULT_LIMITS[:max_lines]) + defaults = default_limits(project: options[:project]) + limits[:max_files] = options.fetch(:max_files, defaults[:max_files]) + limits[:max_lines] = options.fetch(:max_lines, defaults[:max_lines]) limits[:max_bytes] = limits[:max_files] * 5.kilobytes # Average 5 KB per file - limits[:safe_max_files] = [limits[:max_files], DEFAULT_LIMITS[:max_files]].min - limits[:safe_max_lines] = [limits[:max_lines], DEFAULT_LIMITS[:max_lines]].min + + limits[:safe_max_files] = [limits[:max_files], defaults[:max_files]].min + limits[:safe_max_lines] = [limits[:max_lines], defaults[:max_lines]].min limits[:safe_max_bytes] = limits[:safe_max_files] * 5.kilobytes # Average 5 KB per file limits[:max_patch_bytes] = Gitlab::Git::Diff.patch_hard_limit_bytes @@ -110,11 +118,17 @@ module Gitlab files >= safe_max_files || @line_count > safe_max_lines || @byte_count >= safe_max_bytes end + def expand_diff? + # Force single-entry diff collections to always present as expanded + # + @iterator.size == 1 || !@enforce_limits || @expanded + end + def each_gitaly_patch i = @array.length @iterator.each do |raw| - diff = Gitlab::Git::Diff.new(raw, expanded: !@enforce_limits || @expanded) + diff = Gitlab::Git::Diff.new(raw, expanded: expand_diff?) if raw.overflow_marker @overflow = true @@ -137,11 +151,9 @@ module Gitlab break end - expanded = !@enforce_limits || @expanded - - diff = Gitlab::Git::Diff.new(raw, expanded: expanded) + diff = Gitlab::Git::Diff.new(raw, expanded: expand_diff?) - if !expanded && over_safe_limits?(i) && diff.line_count > 0 + if !expand_diff? && over_safe_limits?(i) && diff.line_count > 0 diff.collapse! end diff --git a/lib/gitlab/git/diff_stats_collection.rb b/lib/gitlab/git/diff_stats_collection.rb index 7e49d79676e..e30ec836a49 100644 --- a/lib/gitlab/git/diff_stats_collection.rb +++ b/lib/gitlab/git/diff_stats_collection.rb @@ -22,8 +22,8 @@ module Gitlab @collection.map(&:path) end - def real_size - max_files = ::Commit.max_diff_options[:max_files] + def real_size(project: nil) + max_files = ::Commit.max_diff_options(project: project)[:max_files] if paths.size > max_files "#{max_files}+" else diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 8ace4157ad7..1a3409c1f84 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -297,10 +297,17 @@ module Gitlab end file_name = "#{name}.#{extension}" - File.join(storage_path, self.gl_repository, sha, file_name) + File.join(storage_path, self.gl_repository, sha, archive_version_path, file_name) end private :archive_file_path + def archive_version_path + return '' unless Feature.enabled?(:include_lfs_blobs_in_archive) + + '@v2' + end + private :archive_version_path + # Return repo size in megabytes def size size = gitaly_repository_client.repository_size @@ -580,9 +587,9 @@ module Gitlab tags.find { |tag| tag.name == name } end - def merge_to_ref(user, source_sha, branch, target_ref, message, first_parent_ref) + def merge_to_ref(user, source_sha, branch, target_ref, message, first_parent_ref, allow_conflicts) wrapped_gitaly_errors do - gitaly_operation_client.user_merge_to_ref(user, source_sha, branch, target_ref, message, first_parent_ref) + gitaly_operation_client.user_merge_to_ref(user, source_sha, branch, target_ref, message, first_parent_ref, allow_conflicts) end end @@ -610,7 +617,7 @@ module Gitlab } wrapped_gitaly_errors do - gitaly_operation_client.user_revert(args) + gitaly_operation_client.user_revert(**args) end end @@ -626,7 +633,7 @@ module Gitlab } wrapped_gitaly_errors do - gitaly_operation_client.user_cherry_pick(args) + gitaly_operation_client.user_cherry_pick(**args) end end @@ -640,7 +647,7 @@ module Gitlab } wrapped_gitaly_errors do - gitaly_operation_client.user_update_submodule(args) + gitaly_operation_client.user_update_submodule(**args) end end diff --git a/lib/gitlab/git/wiki.rb b/lib/gitlab/git/wiki.rb index da2d015ca4a..11919be594d 100644 --- a/lib/gitlab/git/wiki.rb +++ b/lib/gitlab/git/wiki.rb @@ -100,10 +100,6 @@ module Gitlab wrapped_gitaly_errors do gitaly_find_page(title: title, version: version, dir: dir) end - rescue Gitlab::Git::CommandError - # Return nil for invalid versions. - # This can be removed with https://gitlab.com/gitlab-org/gitaly/-/merge_requests/2323 in place. - nil end def file(name, version) @@ -159,6 +155,8 @@ module Gitlab return unless wiki_page Gitlab::Git::WikiPage.new(wiki_page, version) + rescue GRPC::InvalidArgument + nil end def gitaly_find_file(name, version) @@ -173,9 +171,9 @@ module Gitlab gitaly_pages = if load_content - gitaly_wiki_client.load_all_pages(params) + gitaly_wiki_client.load_all_pages(**params) else - gitaly_wiki_client.list_all_pages(params) + gitaly_wiki_client.list_all_pages(**params) end gitaly_pages.map do |wiki_page, version| |