diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/api/commits.rb | 2 | ||||
| -rw-r--r-- | lib/api/entities.rb | 6 | ||||
| -rw-r--r-- | lib/api/v3/commits.rb | 2 | ||||
| -rw-r--r-- | lib/api/v3/entities.rb | 2 | ||||
| -rw-r--r-- | lib/gitlab/diff/file_collection/base.rb | 2 | ||||
| -rw-r--r-- | lib/gitlab/email/message/repository_push.rb | 2 | ||||
| -rw-r--r-- | lib/gitlab/git/blob.rb | 1 | ||||
| -rw-r--r-- | lib/gitlab/git/diff.rb | 62 | ||||
| -rw-r--r-- | lib/gitlab/git/diff_collection.rb | 20 | 
9 files changed, 50 insertions, 49 deletions
diff --git a/lib/api/commits.rb b/lib/api/commits.rb index 621b9dcecd9..904993d1606 100644 --- a/lib/api/commits.rb +++ b/lib/api/commits.rb @@ -176,7 +176,7 @@ module API          }          if params[:path] -          commit.raw_diffs(all_diffs: true).each do |diff| +          commit.raw_diffs(no_limits: true).each do |diff|              next unless diff.new_path == params[:path]              lines = Gitlab::Diff::Parser.new.parse(diff.diff.each_line) diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 8c5e5c91769..9799fe68a76 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -331,7 +331,7 @@ module API      class MergeRequestChanges < MergeRequest        expose :diffs, as: :changes, using: Entities::RepoDiff do |compare, _| -        compare.raw_diffs(all_diffs: true).to_a +        compare.raw_diffs(no_limits: true).to_a        end      end @@ -344,7 +344,7 @@ module API        expose :commits, using: Entities::RepoCommit        expose :diffs, using: Entities::RepoDiff do |compare, _| -        compare.raw_diffs(all_diffs: true).to_a +        compare.raw_diffs(no_limits: true).to_a        end      end @@ -548,7 +548,7 @@ module API        end        expose :diffs, using: Entities::RepoDiff do |compare, options| -        compare.diffs(all_diffs: true).to_a +        compare.diffs(no_limits: true).to_a        end        expose :compare_timeout do |compare, options| diff --git a/lib/api/v3/commits.rb b/lib/api/v3/commits.rb index 674de592f0a..ec6c6c7b298 100644 --- a/lib/api/v3/commits.rb +++ b/lib/api/v3/commits.rb @@ -167,7 +167,7 @@ module API            }            if params[:path] -            commit.raw_diffs(all_diffs: true).each do |diff| +            commit.raw_diffs(no_limits: true).each do |diff|                next unless diff.new_path == params[:path]                lines = Gitlab::Diff::Parser.new.parse(diff.diff.each_line) diff --git a/lib/api/v3/entities.rb b/lib/api/v3/entities.rb index 2e1b243c2db..7fbd4949850 100644 --- a/lib/api/v3/entities.rb +++ b/lib/api/v3/entities.rb @@ -226,7 +226,7 @@ module API        class MergeRequestChanges < MergeRequest          expose :diffs, as: :changes, using: ::API::Entities::RepoDiff do |compare, _| -          compare.raw_diffs(all_diffs: true).to_a +          compare.raw_diffs(no_limits: true).to_a          end        end diff --git a/lib/gitlab/diff/file_collection/base.rb b/lib/gitlab/diff/file_collection/base.rb index 79836a2fbab..a6007ebf531 100644 --- a/lib/gitlab/diff/file_collection/base.rb +++ b/lib/gitlab/diff/file_collection/base.rb @@ -7,7 +7,7 @@ module Gitlab          delegate :count, :size, :real_size, to: :diff_files          def self.default_options -          ::Commit.max_diff_options.merge(ignore_whitespace_change: false, no_collapse: false) +          ::Commit.max_diff_options.merge(ignore_whitespace_change: false, expanded: false)          end          def initialize(diffable, project:, diff_options: nil, diff_refs: nil, fallback_diff_refs: nil) diff --git a/lib/gitlab/email/message/repository_push.rb b/lib/gitlab/email/message/repository_push.rb index 6c69cd9e6a9..ea035e33eff 100644 --- a/lib/gitlab/email/message/repository_push.rb +++ b/lib/gitlab/email/message/repository_push.rb @@ -42,7 +42,7 @@ module Gitlab            return unless compare            # This diff is more moderated in number of files and lines -          @diffs ||= compare.diffs(max_files: 30, max_lines: 5000, no_collapse: true).diff_files +          @diffs ||= compare.diffs(max_files: 30, max_lines: 5000, expanded: true).diff_files          end          def diffs_count diff --git a/lib/gitlab/git/blob.rb b/lib/gitlab/git/blob.rb index c1b31618e0d..6b0a66365a7 100644 --- a/lib/gitlab/git/blob.rb +++ b/lib/gitlab/git/blob.rb @@ -88,6 +88,7 @@ module Gitlab            new(              id: blob_entry[:oid],              name: blob_entry[:name], +            size: 0,              data: '',              path: path,              commit_id: sha diff --git a/lib/gitlab/git/diff.rb b/lib/gitlab/git/diff.rb index deade337354..201a115503b 100644 --- a/lib/gitlab/git/diff.rb +++ b/lib/gitlab/git/diff.rb @@ -15,13 +15,13 @@ module Gitlab        alias_method :deleted_file?, :deleted_file        alias_method :renamed_file?, :renamed_file -      attr_accessor :too_large +      attr_accessor :expanded        # The maximum size of a diff to display. -      DIFF_SIZE_LIMIT = 102400 # 100 KB +      SIZE_LIMIT = 100.kilobytes        # The maximum size before a diff is collapsed. -      DIFF_COLLAPSE_LIMIT = 10240 # 10 KB +      COLLAPSE_LIMIT = 10.kilobytes        class << self          def between(repo, head, base, options = {}, *paths) @@ -152,7 +152,7 @@ module Gitlab                               :include_untracked_content, :skip_binary_check,                               :include_typechange, :include_typechange_trees,                               :ignore_filemode, :recurse_ignored_dirs, :paths, -                             :max_files, :max_lines, :all_diffs, :no_collapse] +                             :max_files, :max_lines, :no_limits, :expanded]            if default_options              actual_defaults = default_options.dup @@ -177,16 +177,18 @@ module Gitlab          end        end -      def initialize(raw_diff, collapse: false) +      def initialize(raw_diff, expanded: true) +        @expanded = expanded +          case raw_diff          when Hash            init_from_hash(raw_diff) -          prune_diff_if_eligible(collapse) +          prune_diff_if_eligible          when Rugged::Patch, Rugged::Diff::Delta -          init_from_rugged(raw_diff, collapse: collapse) +          init_from_rugged(raw_diff)          when Gitaly::CommitDiffResponse            init_from_gitaly(raw_diff) -          prune_diff_if_eligible(collapse) +          prune_diff_if_eligible          when Gitaly::CommitDelta            init_from_gitaly(raw_diff)          when nil @@ -225,18 +227,12 @@ module Gitlab        end        def too_large? -        if @too_large.nil? -          @too_large = @diff.bytesize >= DIFF_SIZE_LIMIT -        else -          @too_large -        end -      end +        return @too_large if defined?(@too_large) -      def collapsible? -        @diff.bytesize >= DIFF_COLLAPSE_LIMIT +        @too_large = @diff.bytesize >= SIZE_LIMIT        end -      def prune_large_diff! +      def too_large!          @diff = ''          @line_count = 0          @too_large = true @@ -244,10 +240,11 @@ module Gitlab        def collapsed?          return @collapsed if defined?(@collapsed) -        false + +        @collapsed = !expanded && @diff.bytesize >= COLLAPSE_LIMIT        end -      def prune_collapsed_diff! +      def collapse!          @diff = ''          @line_count = 0          @collapsed = true @@ -255,9 +252,9 @@ module Gitlab        private -      def init_from_rugged(rugged, collapse: false) +      def init_from_rugged(rugged)          if rugged.is_a?(Rugged::Patch) -          init_from_rugged_patch(rugged, collapse: collapse) +          init_from_rugged_patch(rugged)            d = rugged.delta          else            d = rugged @@ -272,10 +269,10 @@ module Gitlab          @deleted_file = d.deleted?        end -      def init_from_rugged_patch(patch, collapse: false) +      def init_from_rugged_patch(patch)          # Don't bother initializing diffs that are too large. If a diff is          # binary we're not going to display anything so we skip the size check. -        return if !patch.delta.binary? && prune_large_patch(patch, collapse) +        return if !patch.delta.binary? && prune_large_patch(patch)          @diff = encode!(strip_diff_headers(patch.to_s))        end @@ -299,29 +296,32 @@ module Gitlab          @deleted_file = msg.to_id == BLANK_SHA        end -      def prune_diff_if_eligible(collapse = false) -        prune_large_diff! if too_large? -        prune_collapsed_diff! if collapse && collapsible? +      def prune_diff_if_eligible +        if too_large? +          too_large! +        elsif collapsed? +          collapse! +        end        end        # If the patch surpasses any of the diff limits it calls the appropiate        # prune method and returns true. Otherwise returns false. -      def prune_large_patch(patch, collapse) +      def prune_large_patch(patch)          size = 0          patch.each_hunk do |hunk|            hunk.each_line do |line|              size += line.content.bytesize -            if size >= DIFF_SIZE_LIMIT -              prune_large_diff! +            if size >= SIZE_LIMIT +              too_large!                return true              end            end          end -        if collapse && size >= DIFF_COLLAPSE_LIMIT -          prune_collapsed_diff! +        if !expanded && size >= COLLAPSE_LIMIT +          collapse!            return true          end diff --git a/lib/gitlab/git/diff_collection.rb b/lib/gitlab/git/diff_collection.rb index 898a5ae15f2..9b217b9080d 100644 --- a/lib/gitlab/git/diff_collection.rb +++ b/lib/gitlab/git/diff_collection.rb @@ -9,12 +9,12 @@ module Gitlab          @iterator = iterator          @max_files = options.fetch(:max_files, DEFAULT_LIMITS[:max_files])          @max_lines = options.fetch(:max_lines, DEFAULT_LIMITS[:max_lines]) -        @max_bytes = @max_files * 5120 # Average 5 KB per file +        @max_bytes = @max_files * 5.kilobytes # Average 5 KB per file          @safe_max_files = [@max_files, DEFAULT_LIMITS[:max_files]].min          @safe_max_lines = [@max_lines, DEFAULT_LIMITS[:max_lines]].min -        @safe_max_bytes = @safe_max_files * 5120 # Average 5 KB per file -        @all_diffs = !!options.fetch(:all_diffs, false) -        @no_collapse = !!options.fetch(:no_collapse, true) +        @safe_max_bytes = @safe_max_files * 5.kilobytes # Average 5 KB per file +        @no_limits = !!options.fetch(:no_limits, false) +        @expanded = !!options.fetch(:expanded, true)          @line_count = 0          @byte_count = 0 @@ -88,23 +88,23 @@ module Gitlab          @iterator.each do |raw|            @empty = false -          if !@all_diffs && i >= @max_files +          if !@no_limits && i >= @max_files              @overflow = true              break            end -          collapse = !@all_diffs && !@no_collapse +          expanded = @no_limits || @expanded -          diff = Gitlab::Git::Diff.new(raw, collapse: collapse) +          diff = Gitlab::Git::Diff.new(raw, expanded: expanded) -          if collapse && over_safe_limits?(i) -            diff.prune_collapsed_diff! +          if !expanded && over_safe_limits?(i) +            diff.collapse!            end            @line_count += diff.line_count            @byte_count += diff.diff.bytesize -          if !@all_diffs && (@line_count >= @max_lines || @byte_count >= @max_bytes) +          if !@no_limits && (@line_count >= @max_lines || @byte_count >= @max_bytes)              # This last Diff instance pushes us over the lines limit. We stop and              # discard it.              @overflow = true  | 
