diff options
Diffstat (limited to 'app/models/merge_request_diff.rb')
-rw-r--r-- | app/models/merge_request_diff.rb | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index b70340a98cd..880e3cc1ba5 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -17,6 +17,10 @@ class MergeRequestDiff < ApplicationRecord # diffs to external storage EXTERNAL_DIFF_CUTOFF = 7.days.freeze + # The files_count column is a 2-byte signed integer. Look up the true value + # from the database if this sentinel is seen + FILES_COUNT_SENTINEL = 2**15 - 1 + belongs_to :merge_request manual_inverse_association :merge_request, :merge_request_diff @@ -150,10 +154,10 @@ class MergeRequestDiff < ApplicationRecord # All diff information is collected from repository after object is created. # It allows you to override variables like head_commit_sha before getting diff. after_create :save_git_content, unless: :importing? - after_create :set_count_columns after_create_commit :set_as_latest_diff, unless: :importing? after_save :update_external_diff_store + after_save :set_count_columns def self.find_by_diff_refs(diff_refs) find_by(start_commit_sha: diff_refs.start_sha, head_commit_sha: diff_refs.head_sha, base_commit_sha: diff_refs.base_sha) @@ -202,6 +206,17 @@ class MergeRequestDiff < ApplicationRecord end end + def files_count + db_value = read_attribute(:files_count) + + case db_value + when nil, FILES_COUNT_SENTINEL + merge_request_diff_files.count + else + db_value + end + end + # This method will rely on repository branch sha # in case start_commit_sha is nil. Its necesarry for old merge request diff # created before version 8.4 to work @@ -423,7 +438,7 @@ class MergeRequestDiff < ApplicationRecord # external storage. If external storage isn't an option for this diff, the # method is a no-op. def migrate_files_to_external_storage! - return if stored_externally? || !use_external_diff? || merge_request_diff_files.count == 0 + return if stored_externally? || !use_external_diff? || files_count == 0 rows = build_merge_request_diff_files(merge_request_diff_files) rows = build_external_merge_request_diff_files(rows) @@ -449,7 +464,7 @@ class MergeRequestDiff < ApplicationRecord # If this diff isn't in external storage, the method is a no-op. def migrate_files_to_database! return unless stored_externally? - return if merge_request_diff_files.count == 0 + return if files_count == 0 rows = convert_external_diffs_to_database @@ -666,7 +681,7 @@ class MergeRequestDiff < ApplicationRecord def set_count_columns update_columns( commits_count: merge_request_diff_commits.size, - files_count: merge_request_diff_files.size + files_count: [FILES_COUNT_SENTINEL, merge_request_diff_files.size].min ) end |