diff --git a/debian/patches/0680-rails-5_1.patch b/debian/patches/0680-rails-5_1.patch new file mode 100644 index 0000000000..ec4497f64f --- /dev/null +++ b/debian/patches/0680-rails-5_1.patch @@ -0,0 +1,2324 @@ +From 4b4e7608e8c035ee6cdf03cdf45500b478f4ab7d Mon Sep 17 00:00:00 2001 +From: Jasper Maes +Date: Tue, 15 Jan 2019 22:05:36 +0100 +Subject: [PATCH] Upgrade Rails to 5.1.6.1 + +Model.new.attributes now also returns encrypted attributes. +--- + Gemfile | 4 +- + Gemfile.lock | 93 +++--- + app/models/ci/build.rb | 4 +- + app/models/ci/job_artifact.rb | 6 +- + app/models/clusters/platforms/kubernetes.rb | 2 +- + .../concerns/storage/legacy_namespace.rb | 4 +- + app/models/group.rb | 4 +- + app/models/lfs_object.rb | 2 +- + app/models/members/group_member.rb | 2 +- + app/models/members/project_member.rb | 2 +- + app/models/merge_request.rb | 2 +- + app/models/namespace.rb | 6 +- + app/models/pages_domain.rb | 12 +- + app/models/project.rb | 6 +- + app/models/remote_mirror.rb | 2 +- + app/models/route.rb | 16 +- + app/models/user.rb | 2 +- + .../projects/propagate_service_template.rb | 2 +- + changelogs/unreleased/rails5-1.yml | 5 + + config/application.rb | 3 - + .../active_record_attr_mutation_tracker.rb | 16 + + ...id_type_casting_in_uniqueness_validator.rb | 94 ------ + config/initializers/active_record_becomes.rb | 29 ++ + .../active_record_build_select.rb | 22 ++ + config/initializers/active_record_locking.rb | 76 ----- + .../initializers/ar_native_database_types.rb | 3 +- + .../postgresql_opclasses_support.rb | 2 +- + ...81638_add_unique_index_to_subscriptions.rb | 4 +- + db/schema.rb | 288 +++++++++--------- + .../performance_bar/peek_query_tracker.rb | 6 +- + lib/gitlab/search_results.rb | 6 +- + spec/fixtures/api/schemas/entities/issue.json | 2 +- + .../schemas/entities/merge_request_basic.json | 2 +- + spec/javascripts/merge_request_spec.js | 2 +- + ...ze_merge_request_diffs_and_commits_spec.rb | 2 +- + .../attribute_configuration_spec.rb | 2 +- + spec/models/ci/runner_spec.rb | 5 +- + spec/requests/api/runner_spec.rb | 2 +- + spec/requests/rack_attack_global_spec.rb | 4 +- + spec/services/users/destroy_service_spec.rb | 4 + + .../migrate_to_ghost_user_service_spec.rb | 2 +- + spec/support/helpers/query_recorder.rb | 2 +- + spec/support/helpers/test_request_helpers.rb | 4 +- + ...e_to_ghost_user_service_shared_examples.rb | 4 +- + 44 files changed, 331 insertions(+), 431 deletions(-) + create mode 100644 changelogs/unreleased/rails5-1.yml + create mode 100644 config/initializers/active_record_attr_mutation_tracker.rb + delete mode 100644 config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb + create mode 100644 config/initializers/active_record_becomes.rb + create mode 100644 config/initializers/active_record_build_select.rb + delete mode 100644 config/initializers/active_record_locking.rb + +--- a/Gemfile ++++ b/Gemfile +@@ -20,7 +20,7 @@ + gem 'pg', '~> 1.1' if ENV["DB"] == "all" || ENV["DB"] == "postgres" + + gem 'rugged', '~> 0.27' +-gem 'grape-path-helpers', '~> 1.0' ++gem 'grape-path-helpers', '~> 1.1' + + gem 'faraday', '~> 0.12' + +--- a/Gemfile.lock ++++ b/Gemfile.lock +@@ -4,41 +4,41 @@ + RedCloth (4.3.2) + abstract_type (0.0.7) + ace-rails-ap (4.1.2) +- actioncable (5.0.7.1) +- actionpack (= 5.0.7.1) +- nio4r (>= 1.2, < 3.0) ++ actioncable (5.1.6.1) ++ actionpack (= 5.1.6.1) ++ nio4r (~> 2.0) + websocket-driver (~> 0.6.1) +- actionmailer (5.0.7.1) +- actionpack (= 5.0.7.1) +- actionview (= 5.0.7.1) +- activejob (= 5.0.7.1) ++ actionmailer (5.1.6.1) ++ actionpack (= 5.1.6.1) ++ actionview (= 5.1.6.1) ++ activejob (= 5.1.6.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) +- actionpack (5.0.7.1) +- actionview (= 5.0.7.1) +- activesupport (= 5.0.7.1) ++ actionpack (5.1.6.1) ++ actionview (= 5.1.6.1) ++ activesupport (= 5.1.6.1) + rack (~> 2.0) +- rack-test (~> 0.6.3) ++ rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) +- actionview (5.0.7.1) +- activesupport (= 5.0.7.1) ++ actionview (5.1.6.1) ++ activesupport (= 5.1.6.1) + builder (~> 3.1) +- erubis (~> 2.7.0) ++ erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) +- activejob (5.0.7.1) +- activesupport (= 5.0.7.1) ++ activejob (5.1.6.1) ++ activesupport (= 5.1.6.1) + globalid (>= 0.3.6) +- activemodel (5.0.7.1) +- activesupport (= 5.0.7.1) +- activerecord (5.0.7.1) +- activemodel (= 5.0.7.1) +- activesupport (= 5.0.7.1) +- arel (~> 7.0) ++ activemodel (5.1.6.1) ++ activesupport (= 5.1.6.1) ++ activerecord (5.1.6.1) ++ activemodel (= 5.1.6.1) ++ activesupport (= 5.1.6.1) ++ arel (~> 8.0) + activerecord_sane_schema_dumper (1.0) + rails (>= 5, < 6) +- activesupport (5.0.7.1) ++ activesupport (5.1.6.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) +@@ -52,7 +52,7 @@ + public_suffix (>= 2.0.2, < 4.0) + aes_key_wrap (1.0.1) + akismet (2.0.0) +- arel (7.1.4) ++ arel (8.0.0) + asana (0.8.1) + faraday (~> 0.9) + faraday_middleware (~> 0.9) +@@ -184,7 +184,6 @@ + encryptor (3.0.0) + equalizer (0.0.11) + erubi (1.7.1) +- erubis (2.7.0) + escape_utils (1.2.1) + et-orbi (1.1.7) + tzinfo +@@ -254,8 +253,8 @@ + fog-xml (0.1.3) + fog-core + nokogiri (>= 1.5.11, < 2.0.0) +- font-awesome-rails (4.7.0.1) +- railties (>= 3.2, < 5.1) ++ font-awesome-rails (4.7.0.4) ++ railties (>= 3.2, < 6.0) + foreman (0.84.0) + thor (~> 0.19.1) + formatador (0.2.5) +@@ -330,8 +329,8 @@ + grape-entity (0.7.1) + activesupport (>= 4.0) + multi_json (>= 1.3.2) +- grape-path-helpers (1.0.6) +- activesupport (>= 4, < 5.1) ++ grape-path-helpers (1.1.0) ++ activesupport + grape (~> 1.0) + rake (~> 12) + grape_logging (1.7.0) +@@ -385,7 +384,7 @@ + json (~> 1.8) + multi_xml (>= 0.5.2) + httpclient (2.8.3) +- i18n (1.2.0) ++ i18n (1.3.0) + concurrent-ruby (~> 1.0) + icalendar (2.4.1) + ice_nine (0.11.2) +@@ -634,19 +633,19 @@ + rack + rack-proxy (0.6.0) + rack +- rack-test (0.6.3) +- rack (>= 1.0) +- rails (5.0.7.1) +- actioncable (= 5.0.7.1) +- actionmailer (= 5.0.7.1) +- actionpack (= 5.0.7.1) +- actionview (= 5.0.7.1) +- activejob (= 5.0.7.1) +- activemodel (= 5.0.7.1) +- activerecord (= 5.0.7.1) +- activesupport (= 5.0.7.1) ++ rack-test (1.1.0) ++ rack (>= 1.0, < 3) ++ rails (5.1.6.1) ++ actioncable (= 5.1.6.1) ++ actionmailer (= 5.1.6.1) ++ actionpack (= 5.1.6.1) ++ actionview (= 5.1.6.1) ++ activejob (= 5.1.6.1) ++ activemodel (= 5.1.6.1) ++ activerecord (= 5.1.6.1) ++ activesupport (= 5.1.6.1) + bundler (>= 1.3.0) +- railties (= 5.0.7.1) ++ railties (= 5.1.6.1) + sprockets-rails (>= 2.0.0) + rails-controller-testing (1.0.2) + actionpack (~> 5.x, >= 5.0.1) +@@ -662,9 +661,9 @@ + rails-i18n (5.1.1) + i18n (>= 0.7, < 2) + railties (>= 5.0, < 6) +- railties (5.0.7.1) +- actionpack (= 5.0.7.1) +- activesupport (= 5.0.7.1) ++ railties (5.1.6.1) ++ actionpack (= 5.1.6.1) ++ activesupport (= 5.1.6.1) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) +@@ -1033,7 +1032,7 @@ + gpgme (~> 2.0.18) + grape (~> 1.1.0) + grape-entity (~> 0.7.1) +- grape-path-helpers (~> 1.0) ++ grape-path-helpers (~> 1.1) + grape_logging (~> 1.7) + graphiql-rails (~> 1.4.10) + graphql (~> 1.8.0) +@@ -1110,7 +1109,7 @@ + rack-cors (~> 1.0.0) + rack-oauth2 (~> 1.2.1) + rack-proxy (~> 0.6.0) +- rails (= 5.0.7.1) ++ rails (= 5.1.6.1) + rails-controller-testing + rails-deprecated_sanitizer (~> 1.0.3) + rails-i18n (~> 5.1) +--- a/app/models/ci/build.rb ++++ b/app/models/ci/build.rb +@@ -146,7 +146,7 @@ + run_after_commit { BuildHooksWorker.perform_async(build.id) } + end + +- after_save :update_project_statistics_after_save, if: :artifacts_size_changed? ++ after_save :update_project_statistics_after_save, if: :saved_change_to_artifacts_size? + after_destroy :update_project_statistics_after_destroy, unless: :project_destroyed? + + class << self +@@ -918,7 +918,7 @@ + end + + def update_project_statistics_after_save +- update_project_statistics(read_attribute(:artifacts_size).to_i - artifacts_size_was.to_i) ++ update_project_statistics(read_attribute(:artifacts_size).to_i - artifacts_size_before_last_save.to_i) + end + + def update_project_statistics_after_destroy +--- a/app/models/ci/job_artifact.rb ++++ b/app/models/ci/job_artifact.rb +@@ -50,10 +50,10 @@ + validates :file_format, presence: true, unless: :trace?, on: :create + validate :valid_file_format?, unless: :trace?, on: :create + before_save :set_size, if: :file_changed? +- after_save :update_project_statistics_after_save, if: :size_changed? ++ after_save :update_project_statistics_after_save, if: :saved_change_to_size? + after_destroy :update_project_statistics_after_destroy, unless: :project_destroyed? + +- after_save :update_file_store, if: :file_changed? ++ after_save :update_file_store, if: :saved_change_to_file? + + scope :with_files_stored_locally, -> { where(file_store: [nil, ::JobArtifactUploader::Store::LOCAL]) } + +@@ -174,7 +174,7 @@ + end + + def update_project_statistics_after_save +- update_project_statistics(size.to_i - size_was.to_i) ++ update_project_statistics(size.to_i - size_before_last_save.to_i) + end + + def update_project_statistics_after_destroy +--- a/app/models/clusters/platforms/kubernetes.rb ++++ b/app/models/clusters/platforms/kubernetes.rb +@@ -229,7 +229,7 @@ + end + + def update_kubernetes_namespace +- return unless namespace_changed? ++ return unless saved_change_to_namespace? + + run_after_commit do + ClusterConfigureWorker.perform_async(cluster_id) +--- a/app/models/concerns/storage/legacy_namespace.rb ++++ b/app/models/concerns/storage/legacy_namespace.rb +@@ -13,8 +13,8 @@ + raise Gitlab::UpdatePathError.new("Namespace #{name} (#{id}) cannot be moved because at least one project (e.g. #{proj_with_tags.name} (#{proj_with_tags.id})) has tags in container registry") + end + +- parent_was = if parent_changed? && parent_id_was.present? +- Namespace.find(parent_id_was) # raise NotFound early if needed ++ parent_was = if parent_changed? && parent_id_before_last_save.present? ++ Namespace.find(parent_id_before_last_save) # raise NotFound early if needed + end + + move_repositories +--- a/app/models/group.rb ++++ b/app/models/group.rb +@@ -61,7 +61,7 @@ + after_create :post_create_hook + after_destroy :post_destroy_hook + after_save :update_two_factor_requirement +- after_update :path_changed_hook, if: :path_changed? ++ after_update :path_changed_hook, if: :saved_change_to_path? + + class << self + def sort_by_attribute(method) +@@ -408,7 +408,7 @@ + private + + def update_two_factor_requirement +- return unless require_two_factor_authentication_changed? || two_factor_grace_period_changed? ++ return unless saved_change_to_require_two_factor_authentication? || saved_change_to_two_factor_grace_period? + + users.find_each(&:update_two_factor_requirement) + end +--- a/app/models/lfs_object.rb ++++ b/app/models/lfs_object.rb +@@ -13,7 +13,7 @@ + + mount_uploader :file, LfsObjectUploader + +- after_save :update_file_store, if: :file_changed? ++ after_save :update_file_store, if: :saved_change_to_file? + + def update_file_store + # The file.object_store is set during `uploader.store!` +--- a/app/models/members/group_member.rb ++++ b/app/models/members/group_member.rb +@@ -53,7 +53,7 @@ + end + + def post_update_hook +- if access_level_changed? ++ if saved_change_to_access_level? + run_after_commit { notification_service.update_group_member(self) } + end + +--- a/app/models/members/project_member.rb ++++ b/app/models/members/project_member.rb +@@ -111,7 +111,7 @@ + end + + def post_update_hook +- if access_level_changed? ++ if saved_change_to_access_level? + run_after_commit { notification_service.update_project_member(self) } + end + +--- a/app/models/merge_request.rb ++++ b/app/models/merge_request.rb +@@ -699,7 +699,7 @@ + end + + def reload_diff_if_branch_changed +- if (source_branch_changed? || target_branch_changed?) && ++ if (saved_change_to_source_branch? || saved_change_to_target_branch?) && + (source_branch_head && target_branch_head) + reload_diff + end +--- a/app/models/namespace.rb ++++ b/app/models/namespace.rb +@@ -49,13 +49,15 @@ + + validate :nesting_level_allowed + ++ validates_associated :runners ++ + delegate :name, to: :owner, allow_nil: true, prefix: true + + after_commit :refresh_access_of_projects_invited_groups, on: :update, if: -> { previous_changes.key?('share_with_group_lock') } + + before_create :sync_share_with_group_lock_with_parent + before_update :sync_share_with_group_lock_with_parent, if: :parent_changed? +- after_update :force_share_with_group_lock_on_descendants, if: -> { share_with_group_lock_changed? && share_with_group_lock? } ++ after_update :force_share_with_group_lock_on_descendants, if: -> { saved_change_to_share_with_group_lock? && share_with_group_lock? } + + # Legacy Storage specific hooks + +@@ -270,7 +272,7 @@ + private + + def path_or_parent_changed? +- path_changed? || parent_changed? ++ saved_change_to_path? || saved_change_to_parent_id? + end + + def refresh_access_of_projects_invited_groups +--- a/app/models/pages_domain.rb ++++ b/app/models/pages_domain.rb +@@ -147,20 +147,20 @@ + # rubocop: enable CodeReuse/ServiceClass + + def pages_config_changed? +- project_id_changed? || +- domain_changed? || +- certificate_changed? || +- key_changed? || ++ saved_change_to_project_id? || ++ saved_change_to_domain? || ++ saved_change_to_certificate? || ++ saved_change_to_key? || + became_enabled? || + became_disabled? + end + + def became_enabled? +- enabled_until.present? && !enabled_until_was.present? ++ enabled_until.present? && !enabled_until_before_last_save.present? + end + + def became_disabled? +- !enabled_until.present? && enabled_until_was.present? ++ !enabled_until.present? && enabled_until_before_last_save.present? + end + + def validate_matching_key +--- a/app/models/project.rb ++++ b/app/models/project.rb +@@ -91,7 +91,7 @@ + + before_save :ensure_runners_token + +- after_save :update_project_statistics, if: :namespace_id_changed? ++ after_save :update_project_statistics, if: :saved_change_to_namespace_id? + + after_save :create_import_state, if: ->(project) { project.import? && project.import_state.nil? } + +@@ -117,7 +117,7 @@ + after_initialize :use_hashed_storage + after_create :check_repository_absence! + after_create :ensure_storage_path_exists +- after_save :ensure_storage_path_exists, if: :namespace_id_changed? ++ after_save :ensure_storage_path_exists, if: :saved_change_to_namespace_id? + + acts_as_ordered_taggable + +@@ -1405,7 +1405,7 @@ + + # update visibility_level of forks + def update_forks_visibility_level +- return unless visibility_level < visibility_level_was ++ return unless visibility_level < visibility_level_before_last_save + + forks.each do |forked_project| + if forked_project.visibility_level > visibility_level +--- a/app/models/remote_mirror.rb ++++ b/app/models/remote_mirror.rb +@@ -248,7 +248,7 @@ + + # Before adding a new remote we have to delete the data from + # the previous remote name +- prev_remote_name = remote_name_was || fallback_remote_name ++ prev_remote_name = remote_name_before_last_save || fallback_remote_name + run_after_commit do + project.repository.async_remove_remote(prev_remote_name) + end +--- a/app/models/route.rb ++++ b/app/models/route.rb +@@ -14,26 +14,26 @@ + + before_validation :delete_conflicting_orphaned_routes + after_create :delete_conflicting_redirects +- after_update :delete_conflicting_redirects, if: :path_changed? ++ after_update :delete_conflicting_redirects, if: :saved_change_to_path? + after_update :create_redirect_for_old_path + after_update :rename_descendants + + scope :inside_path, -> (path) { where('routes.path LIKE ?', "#{sanitize_sql_like(path)}/%") } + + def rename_descendants +- return unless path_changed? || name_changed? ++ return unless saved_change_to_path? || saved_change_to_name? + +- descendant_routes = self.class.inside_path(path_was) ++ descendant_routes = self.class.inside_path(path_before_last_save) + + descendant_routes.each do |route| + attributes = {} + +- if path_changed? && route.path.present? +- attributes[:path] = route.path.sub(path_was, path) ++ if saved_change_to_path? && route.path.present? ++ attributes[:path] = route.path.sub(path_before_last_save, path) + end + +- if name_changed? && name_was.present? && route.name.present? +- attributes[:name] = route.name.sub(name_was, name) ++ if saved_change_to_name? && name_before_last_save.present? && route.name.present? ++ attributes[:name] = route.name.sub(name_before_last_save, name) + end + + if attributes.present? +@@ -65,7 +65,7 @@ + private + + def create_redirect_for_old_path +- create_redirect(path_was) if path_changed? ++ create_redirect(path_before_last_save) if saved_change_to_path? + end + + def delete_conflicting_orphaned_routes +--- a/app/models/user.rb ++++ b/app/models/user.rb +@@ -193,7 +193,7 @@ + before_validation :ensure_namespace_correct + before_save :ensure_namespace_correct # in case validation is skipped + after_validation :set_username_errors +- after_update :username_changed_hook, if: :username_changed? ++ after_update :username_changed_hook, if: :saved_change_to_username? + after_destroy :post_destroy_hook + after_destroy :remove_key_cache + after_commit(on: :update) do +--- a/app/services/projects/propagate_service_template.rb ++++ b/app/services/projects/propagate_service_template.rb +@@ -80,7 +80,7 @@ + value = value.is_a?(Hash) ? value.to_json : value + + service_hash[ActiveRecord::Base.connection.quote_column_name(key)] = +- ActiveRecord::Base.sanitize(value) ++ ActiveRecord::Base.connection.quote(value) + end + end + end +--- /dev/null ++++ b/changelogs/unreleased/rails5-1.yml +@@ -0,0 +1,5 @@ ++--- ++title: Rails 5.1 ++merge_request: 24852 ++author: Jasper Maes ++type: other +--- a/config/application.rb ++++ b/config/application.rb +@@ -162,9 +162,6 @@ + + config.action_view.sanitized_allowed_protocols = %w(smb) + +- # Can be removed once upgraded to Rails 5.1 or higher +- config.action_controller.raise_on_unfiltered_parameters = true +- + # Nokogiri is significantly faster and uses less memory than REXML + ActiveSupport::XmlMini.backend = 'Nokogiri' + +--- /dev/null ++++ b/config/initializers/active_record_attr_mutation_tracker.rb +@@ -0,0 +1,16 @@ ++# Remove once https://github.com/rails/rails/pull/32498 ++# is released on a 5.1.x rails version. ++# Commit on 5-1-stable branch: https://github.com/rails/rails/commit/6ef736625eddf6700f2e67f7849c79c92381abee ++ ++module ActiveRecord ++ class AttributeMutationTracker ++ def changes ++ attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result| ++ change = change_to_attribute(attr_name) ++ if change ++ result.merge!(attr_name => change) ++ end ++ end ++ end ++ end ++end +--- a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb ++++ /dev/null +@@ -1,94 +0,0 @@ +-# This is a monkey patch which must be removed when migrating to Rails 5.1 from 5.0. +-# +-# In Rails 5.0 there was introduced a bug which casts types in the uniqueness validator. +-# https://github.com/rails/rails/pull/23523/commits/811a4fa8eb6ceea841e61e8ac05747ffb69595ae +-# +-# That causes to bugs like this: +-# +-# 1) API::Users POST /user/:id/gpg_keys/:key_id/revoke when authenticated revokes existing key +-# Failure/Error: let(:gpg_key) { create(:gpg_key, user: user) } +-# +-# TypeError: +-# can't cast Hash +-# # ./spec/requests/api/users_spec.rb:7:in `block (2 levels) in ' +-# # ./spec/requests/api/users_spec.rb:908:in `block (4 levels) in ' +-# # ------------------ +-# # --- Caused by: --- +-# # TypeError: +-# # TypeError +-# # ./spec/requests/api/users_spec.rb:7:in `block (2 levels) in ' +-# +-# This bug was fixed in Rails 5.1 by https://github.com/rails/rails/pull/24745/commits/aa062318c451512035c10898a1af95943b1a3803 +- +-if Rails.gem_version >= Gem::Version.new("5.1") +- raise "Remove this monkey patch: #{__FILE__}" +-end +- +-# Copy-paste from https://github.com/kamipo/rails/blob/aa062318c451512035c10898a1af95943b1a3803/activerecord/lib/active_record/validations/uniqueness.rb +-# including local fixes to make Rubocop happy again. +-module ActiveRecord +- module Validations +- class UniquenessValidator < ActiveModel::EachValidator # :nodoc: +- def validate_each(record, attribute, value) +- finder_class = find_finder_class_for(record) +- table = finder_class.arel_table +- value = map_enum_attribute(finder_class, attribute, value) +- +- relation = build_relation(finder_class, table, attribute, value) +- +- if record.persisted? +- if finder_class.primary_key +- relation = relation.where.not(finder_class.primary_key => record.id_was || record.id) +- else +- raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.") +- end +- end +- +- relation = scope_relation(record, table, relation) +- relation = relation.merge(options[:conditions]) if options[:conditions] +- +- if relation.exists? +- error_options = options.except(:case_sensitive, :scope, :conditions) +- error_options[:value] = value +- +- record.errors.add(attribute, :taken, error_options) +- end +- rescue RangeError +- end +- +- protected +- +- def build_relation(klass, table, attribute, value) #:nodoc: +- if reflection = klass._reflect_on_association(attribute) +- attribute = reflection.foreign_key +- value = value.attributes[reflection.klass.primary_key] unless value.nil? +- end +- +- # the attribute may be an aliased attribute +- if klass.attribute_alias?(attribute) +- attribute = klass.attribute_alias(attribute) +- end +- +- attribute_name = attribute.to_s +- +- column = klass.columns_hash[attribute_name] +- cast_type = klass.type_for_attribute(attribute_name) +- +- comparison = +- if !options[:case_sensitive] && !value.nil? +- # will use SQL LOWER function before comparison, unless it detects a case insensitive collation +- klass.connection.case_insensitive_comparison(table, attribute, column, value) +- else +- klass.connection.case_sensitive_comparison(table, attribute, column, value) +- end +- +- if value.nil? +- klass.unscoped.where(comparison) +- else +- bind = Relation::QueryAttribute.new(attribute_name, value, cast_type) +- klass.unscoped.where(comparison, bind) +- end +- end +- end +- end +-end +--- /dev/null ++++ b/config/initializers/active_record_becomes.rb +@@ -0,0 +1,29 @@ ++# rubocop:disable Gitlab/ModuleWithInstanceVariables ++ ++# Remove once https://github.com/rails/rails/issues/32867 ++# is released on a 5.1.x rails version. ++# Commit on 5-1-stable branch: https://github.com/rails/rails/commit/44f0df3f3980ba3aeca956839e1948b246ff34fe ++ ++module ActiveRecord ++ module AttributeMethods ++ module Dirty ++ def attributes_in_database ++ mutations_from_database.changed_values ++ end ++ end ++ end ++ ++ module Persistence ++ def becomes(klass) ++ became = klass.new ++ became.instance_variable_set("@attributes", @attributes) ++ became.instance_variable_set("@mutation_tracker", @mutation_tracker ||= nil) ++ became.instance_variable_set("@mutations_from_database", @mutations_from_database ||= nil) ++ became.instance_variable_set("@changed_attributes", attributes_changed_by_setter) ++ became.instance_variable_set("@new_record", new_record?) ++ became.instance_variable_set("@destroyed", destroyed?) ++ became.errors.copy!(errors) ++ became ++ end ++ end ++end +--- /dev/null ++++ b/config/initializers/active_record_build_select.rb +@@ -0,0 +1,22 @@ ++# rubocop:disable Gitlab/ModuleWithInstanceVariables ++ ++# build_select only selects the required fields if the model has ignored_columns. ++# This is incompatible with some migrations or background migration specs because ++# rails keeps a statement cache in memory. So if a model with ignored_columns in a ++# migration is used, the query with select table.col1, table.col2 is stored in the ++# statement cache. If a different migration is then run and one of these columns is ++# removed in the meantime, the query is invalid. ++ ++module ActiveRecord ++ module QueryMethods ++ private ++ ++ def build_select(arel) ++ if select_values.any? ++ arel.project(*arel_columns(select_values.uniq)) ++ else ++ arel.project(@klass.arel_table[Arel.star]) ++ end ++ end ++ end ++end +--- a/config/initializers/active_record_locking.rb ++++ /dev/null +@@ -1,76 +0,0 @@ +-# rubocop:disable Lint/RescueException +- +-# Remove this monkey patch when we move to Rails 5.1, because the bug has been fixed in https://github.com/rails/rails/pull/26050. +-if Rails.gem_version >= Gem::Version.new("5.1") +- raise "Remove this monkey patch: #{__FILE__}" +-end +- +-module ActiveRecord +- module Locking +- module Optimistic +- # We overwrite this method because we don't want to have default value +- # for newly created records +- def _create_record(attribute_names = self.attribute_names, *) # :nodoc: +- super +- end +- +- def _update_record(attribute_names = self.attribute_names) #:nodoc: +- return super unless locking_enabled? +- return 0 if attribute_names.empty? +- +- lock_col = self.class.locking_column +- previous_lock_value = send(lock_col).to_i +- increment_lock +- +- attribute_names += [lock_col] +- attribute_names.uniq! +- +- begin +- relation = self.class.unscoped +- +- affected_rows = relation.where( +- self.class.primary_key => id, +- # Patched because when `lock_version` is read as `0`, it may actually be `NULL` in the DB. +- lock_col => previous_lock_value == 0 ? [nil, 0] : previous_lock_value +- ).update_all( +- attributes_for_update(attribute_names).map do |name| +- [name, _read_attribute(name)] +- end.to_h +- ) +- +- unless affected_rows == 1 +- raise ActiveRecord::StaleObjectError.new(self, "update") +- end +- +- affected_rows +- +- # If something went wrong, revert the version. +- rescue Exception +- send(lock_col + '=', previous_lock_value) +- raise +- end +- end +- +- # This is patched because we need it to query `lock_version IS NULL` +- # rather than `lock_version = 0` whenever lock_version is NULL. +- def relation_for_destroy +- return super unless locking_enabled? +- +- column_name = self.class.locking_column +- super.where(self.class.arel_table[column_name].eq(self[column_name])) +- end +- end +- +- # This is patched because we want `lock_version` default to `NULL` +- # rather than `0` +- class LockingType +- def deserialize(value) +- super +- end +- +- def serialize(value) +- super +- end +- end +- end +-end +--- a/config/initializers/ar_native_database_types.rb ++++ b/config/initializers/ar_native_database_types.rb +@@ -4,7 +4,8 @@ + module ConnectionAdapters + class AbstractMysqlAdapter + NATIVE_DATABASE_TYPES.merge!( +- bigserial: { name: 'bigint(20) auto_increment PRIMARY KEY' } ++ bigserial: { name: 'bigint(20) auto_increment PRIMARY KEY' }, ++ serial: { name: 'int auto_increment PRIMARY KEY' } + ) + end + end +--- a/config/initializers/postgresql_opclasses_support.rb ++++ b/config/initializers/postgresql_opclasses_support.rb +@@ -78,7 +78,7 @@ + if index_name.length > max_index_length + raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters" + end +- if data_source_exists?(table_name) && index_name_exists?(table_name, index_name, false) ++ if data_source_exists?(table_name) && index_name_exists?(table_name, index_name) + raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists" + end + index_columns = quoted_columns_for_index(column_names, options).join(", ") +--- a/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb ++++ b/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb +@@ -9,11 +9,11 @@ + + def up + add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id, :project_id], { unique: true, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' } +- remove_index :subscriptions, name: 'subscriptions_user_id_and_ref_fields' if index_name_exists?(:subscriptions, 'subscriptions_user_id_and_ref_fields', false) ++ remove_index :subscriptions, name: 'subscriptions_user_id_and_ref_fields' if index_name_exists?(:subscriptions, 'subscriptions_user_id_and_ref_fields') + end + + def down + add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id], { unique: true, name: 'subscriptions_user_id_and_ref_fields' } +- remove_index :subscriptions, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' if index_name_exists?(:subscriptions, 'index_subscriptions_on_subscribable_and_user_id_and_project_id', false) ++ remove_index :subscriptions, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' if index_name_exists?(:subscriptions, 'index_subscriptions_on_subscribable_and_user_id_and_project_id') + end + end +--- a/db/schema.rb ++++ b/db/schema.rb +@@ -16,7 +16,7 @@ + enable_extension "plpgsql" + enable_extension "pg_trgm" + +- create_table "abuse_reports", force: :cascade do |t| ++ create_table "abuse_reports", id: :serial, force: :cascade do |t| + t.integer "reporter_id" + t.integer "user_id" + t.text "message" +@@ -26,7 +26,7 @@ + t.integer "cached_markdown_version" + end + +- create_table "appearances", force: :cascade do |t| ++ create_table "appearances", id: :serial, force: :cascade do |t| + t.string "title", null: false + t.text "description", null: false + t.string "header_logo" +@@ -40,13 +40,13 @@ + t.string "favicon" + end + +- create_table "application_setting_terms", force: :cascade do |t| ++ create_table "application_setting_terms", id: :serial, force: :cascade do |t| + t.integer "cached_markdown_version" + t.text "terms", null: false + t.text "terms_html" + end + +- create_table "application_settings", force: :cascade do |t| ++ create_table "application_settings", id: :serial, force: :cascade do |t| + t.integer "default_projects_limit" + t.boolean "signup_enabled" + t.boolean "gravatar_enabled" +@@ -173,7 +173,7 @@ + t.index ["usage_stats_set_by_user_id"], name: "index_application_settings_on_usage_stats_set_by_user_id", using: :btree + end + +- create_table "audit_events", force: :cascade do |t| ++ create_table "audit_events", id: :serial, force: :cascade do |t| + t.integer "author_id", null: false + t.string "type", null: false + t.integer "entity_id", null: false +@@ -184,7 +184,7 @@ + t.index ["entity_id", "entity_type"], name: "index_audit_events_on_entity_id_and_entity_type", using: :btree + end + +- create_table "award_emoji", force: :cascade do |t| ++ create_table "award_emoji", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "user_id" + t.integer "awardable_id" +@@ -195,7 +195,7 @@ + t.index ["user_id", "name"], name: "index_award_emoji_on_user_id_and_name", using: :btree + end + +- create_table "badges", force: :cascade do |t| ++ create_table "badges", id: :serial, force: :cascade do |t| + t.string "link_url", null: false + t.string "image_url", null: false + t.integer "project_id" +@@ -207,7 +207,7 @@ + t.index ["project_id"], name: "index_badges_on_project_id", using: :btree + end + +- create_table "board_group_recent_visits", id: :bigserial, force: :cascade do |t| ++ create_table "board_group_recent_visits", force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id" +@@ -219,7 +219,7 @@ + t.index ["user_id"], name: "index_board_group_recent_visits_on_user_id", using: :btree + end + +- create_table "board_project_recent_visits", id: :bigserial, force: :cascade do |t| ++ create_table "board_project_recent_visits", force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id" +@@ -231,7 +231,7 @@ + t.index ["user_id"], name: "index_board_project_recent_visits_on_user_id", using: :btree + end + +- create_table "boards", force: :cascade do |t| ++ create_table "boards", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false +@@ -240,7 +240,7 @@ + t.index ["project_id"], name: "index_boards_on_project_id", using: :btree + end + +- create_table "broadcast_messages", force: :cascade do |t| ++ create_table "broadcast_messages", id: :serial, force: :cascade do |t| + t.text "message", null: false + t.datetime "starts_at", null: false + t.datetime "ends_at", null: false +@@ -253,7 +253,7 @@ + t.index ["starts_at", "ends_at", "id"], name: "index_broadcast_messages_on_starts_at_and_ends_at_and_id", using: :btree + end + +- create_table "chat_names", force: :cascade do |t| ++ create_table "chat_names", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "service_id", null: false + t.string "team_id", null: false +@@ -267,7 +267,7 @@ + t.index ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree + end + +- create_table "chat_teams", force: :cascade do |t| ++ create_table "chat_teams", id: :serial, force: :cascade do |t| + t.integer "namespace_id", null: false + t.string "team_id" + t.string "name" +@@ -276,7 +276,7 @@ + t.index ["namespace_id"], name: "index_chat_teams_on_namespace_id", unique: true, using: :btree + end + +- create_table "ci_build_trace_chunks", id: :bigserial, force: :cascade do |t| ++ create_table "ci_build_trace_chunks", force: :cascade do |t| + t.integer "build_id", null: false + t.integer "chunk_index", null: false + t.integer "data_store", null: false +@@ -284,13 +284,13 @@ + t.index ["build_id", "chunk_index"], name: "index_ci_build_trace_chunks_on_build_id_and_chunk_index", unique: true, using: :btree + end + +- create_table "ci_build_trace_section_names", force: :cascade do |t| ++ create_table "ci_build_trace_section_names", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.index ["project_id", "name"], name: "index_ci_build_trace_section_names_on_project_id_and_name", unique: true, using: :btree + end + +- create_table "ci_build_trace_sections", force: :cascade do |t| ++ create_table "ci_build_trace_sections", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.datetime_with_timezone "date_start", null: false + t.datetime_with_timezone "date_end", null: false +@@ -303,7 +303,7 @@ + t.index ["section_name_id"], name: "index_ci_build_trace_sections_on_section_name_id", using: :btree + end + +- create_table "ci_builds", force: :cascade do |t| ++ create_table "ci_builds", id: :serial, force: :cascade do |t| + t.string "status" + t.datetime "finished_at" + t.text "trace" +@@ -370,7 +370,7 @@ + t.index ["user_id"], name: "index_ci_builds_on_user_id", using: :btree + end + +- create_table "ci_builds_metadata", force: :cascade do |t| ++ create_table "ci_builds_metadata", id: :serial, force: :cascade do |t| + t.integer "build_id", null: false + t.integer "project_id", null: false + t.integer "timeout" +@@ -381,7 +381,7 @@ + t.index ["project_id"], name: "index_ci_builds_metadata_on_project_id", using: :btree + end + +- create_table "ci_builds_runner_session", id: :bigserial, force: :cascade do |t| ++ create_table "ci_builds_runner_session", force: :cascade do |t| + t.integer "build_id", null: false + t.string "url", null: false + t.string "certificate" +@@ -389,7 +389,7 @@ + t.index ["build_id"], name: "index_ci_builds_runner_session_on_build_id", unique: true, using: :btree + end + +- create_table "ci_group_variables", force: :cascade do |t| ++ create_table "ci_group_variables", id: :serial, force: :cascade do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" +@@ -402,7 +402,7 @@ + t.index ["group_id", "key"], name: "index_ci_group_variables_on_group_id_and_key", unique: true, using: :btree + end + +- create_table "ci_job_artifacts", force: :cascade do |t| ++ create_table "ci_job_artifacts", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "job_id", null: false + t.integer "file_type", null: false +@@ -433,7 +433,7 @@ + t.index ["pipeline_schedule_id", "key"], name: "index_ci_pipeline_schedule_variables_on_schedule_id_and_key", unique: true, using: :btree + end + +- create_table "ci_pipeline_schedules", force: :cascade do |t| ++ create_table "ci_pipeline_schedules", id: :serial, force: :cascade do |t| + t.string "description" + t.string "ref" + t.string "cron" +@@ -449,7 +449,7 @@ + t.index ["project_id"], name: "index_ci_pipeline_schedules_on_project_id", using: :btree + end + +- create_table "ci_pipeline_variables", force: :cascade do |t| ++ create_table "ci_pipeline_variables", id: :serial, force: :cascade do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" +@@ -459,7 +459,7 @@ + t.index ["pipeline_id", "key"], name: "index_ci_pipeline_variables_on_pipeline_id_and_key", unique: true, using: :btree + end + +- create_table "ci_pipelines", force: :cascade do |t| ++ create_table "ci_pipelines", id: :serial, force: :cascade do |t| + t.string "ref" + t.string "sha" + t.string "before_sha" +@@ -497,14 +497,14 @@ + t.index ["user_id"], name: "index_ci_pipelines_on_user_id", using: :btree + end + +- create_table "ci_runner_namespaces", force: :cascade do |t| ++ create_table "ci_runner_namespaces", id: :serial, force: :cascade do |t| + t.integer "runner_id" + t.integer "namespace_id" + t.index ["namespace_id"], name: "index_ci_runner_namespaces_on_namespace_id", using: :btree + t.index ["runner_id", "namespace_id"], name: "index_ci_runner_namespaces_on_runner_id_and_namespace_id", unique: true, using: :btree + end + +- create_table "ci_runner_projects", force: :cascade do |t| ++ create_table "ci_runner_projects", id: :serial, force: :cascade do |t| + t.integer "runner_id", null: false + t.datetime "created_at" + t.datetime "updated_at" +@@ -513,7 +513,7 @@ + t.index ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree + end + +- create_table "ci_runners", force: :cascade do |t| ++ create_table "ci_runners", id: :serial, force: :cascade do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" +@@ -540,7 +540,7 @@ + t.index ["token"], name: "index_ci_runners_on_token", using: :btree + end + +- create_table "ci_stages", force: :cascade do |t| ++ create_table "ci_stages", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.integer "pipeline_id" + t.datetime "created_at" +@@ -555,7 +555,7 @@ + t.index ["project_id"], name: "index_ci_stages_on_project_id", using: :btree + end + +- create_table "ci_trigger_requests", force: :cascade do |t| ++ create_table "ci_trigger_requests", id: :serial, force: :cascade do |t| + t.integer "trigger_id", null: false + t.text "variables" + t.datetime "created_at" +@@ -565,7 +565,7 @@ + t.index ["trigger_id"], name: "index_ci_trigger_requests_on_trigger_id", using: :btree + end + +- create_table "ci_triggers", force: :cascade do |t| ++ create_table "ci_triggers", id: :serial, force: :cascade do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" +@@ -577,7 +577,7 @@ + t.index ["project_id"], name: "index_ci_triggers_on_project_id", using: :btree + end + +- create_table "ci_variables", force: :cascade do |t| ++ create_table "ci_variables", id: :serial, force: :cascade do |t| + t.string "key", null: false + t.text "value" + t.text "encrypted_value" +@@ -589,14 +589,14 @@ + t.index ["project_id", "key", "environment_scope"], name: "index_ci_variables_on_project_id_and_key_and_environment_scope", unique: true, using: :btree + end + +- create_table "cluster_groups", force: :cascade do |t| ++ create_table "cluster_groups", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "group_id", null: false + t.index ["cluster_id", "group_id"], name: "index_cluster_groups_on_cluster_id_and_group_id", unique: true, using: :btree + t.index ["group_id"], name: "index_cluster_groups_on_group_id", using: :btree + end + +- create_table "cluster_platforms_kubernetes", force: :cascade do |t| ++ create_table "cluster_platforms_kubernetes", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false +@@ -612,7 +612,7 @@ + t.index ["cluster_id"], name: "index_cluster_platforms_kubernetes_on_cluster_id", unique: true, using: :btree + end + +- create_table "cluster_projects", force: :cascade do |t| ++ create_table "cluster_projects", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false +@@ -621,7 +621,7 @@ + t.index ["project_id"], name: "index_cluster_projects_on_project_id", using: :btree + end + +- create_table "cluster_providers_gcp", force: :cascade do |t| ++ create_table "cluster_providers_gcp", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "status" + t.integer "num_nodes", null: false +@@ -639,7 +639,7 @@ + t.index ["cluster_id"], name: "index_cluster_providers_gcp_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters", force: :cascade do |t| ++ create_table "clusters", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.integer "provider_type" + t.integer "platform_type" +@@ -654,7 +654,7 @@ + t.index ["user_id"], name: "index_clusters_on_user_id", using: :btree + end + +- create_table "clusters_applications_cert_managers", force: :cascade do |t| ++ create_table "clusters_applications_cert_managers", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "status", null: false + t.string "version", null: false +@@ -665,7 +665,7 @@ + t.index ["cluster_id"], name: "index_clusters_applications_cert_managers_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters_applications_helm", force: :cascade do |t| ++ create_table "clusters_applications_helm", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false +@@ -678,7 +678,7 @@ + t.index ["cluster_id"], name: "index_clusters_applications_helm_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters_applications_ingress", force: :cascade do |t| ++ create_table "clusters_applications_ingress", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false +@@ -691,7 +691,7 @@ + t.index ["cluster_id"], name: "index_clusters_applications_ingress_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters_applications_jupyter", force: :cascade do |t| ++ create_table "clusters_applications_jupyter", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "oauth_application_id" + t.integer "status", null: false +@@ -704,7 +704,7 @@ + t.index ["oauth_application_id"], name: "index_clusters_applications_jupyter_on_oauth_application_id", using: :btree + end + +- create_table "clusters_applications_knative", force: :cascade do |t| ++ create_table "clusters_applications_knative", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false +@@ -716,7 +716,7 @@ + t.index ["cluster_id"], name: "index_clusters_applications_knative_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters_applications_prometheus", force: :cascade do |t| ++ create_table "clusters_applications_prometheus", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "status", null: false + t.string "version", null: false +@@ -726,7 +726,7 @@ + t.index ["cluster_id"], name: "index_clusters_applications_prometheus_on_cluster_id", unique: true, using: :btree + end + +- create_table "clusters_applications_runners", force: :cascade do |t| ++ create_table "clusters_applications_runners", id: :serial, force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "runner_id" + t.integer "status", null: false +@@ -739,7 +739,7 @@ + t.index ["runner_id"], name: "index_clusters_applications_runners_on_runner_id", using: :btree + end + +- create_table "clusters_kubernetes_namespaces", id: :bigserial, force: :cascade do |t| ++ create_table "clusters_kubernetes_namespaces", force: :cascade do |t| + t.integer "cluster_id", null: false + t.integer "project_id" + t.integer "cluster_project_id" +@@ -755,7 +755,7 @@ + t.index ["project_id"], name: "index_clusters_kubernetes_namespaces_on_project_id", using: :btree + end + +- create_table "container_repositories", force: :cascade do |t| ++ create_table "container_repositories", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at", null: false +@@ -764,7 +764,7 @@ + t.index ["project_id"], name: "index_container_repositories_on_project_id", using: :btree + end + +- create_table "conversational_development_index_metrics", force: :cascade do |t| ++ create_table "conversational_development_index_metrics", id: :serial, force: :cascade do |t| + t.float "leader_issues", null: false + t.float "instance_issues", null: false + t.float "leader_notes", null: false +@@ -799,7 +799,7 @@ + t.float "percentage_service_desk_issues", default: 0.0, null: false + end + +- create_table "deploy_keys_projects", force: :cascade do |t| ++ create_table "deploy_keys_projects", id: :serial, force: :cascade do |t| + t.integer "deploy_key_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" +@@ -808,7 +808,7 @@ + t.index ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree + end + +- create_table "deploy_tokens", force: :cascade do |t| ++ create_table "deploy_tokens", id: :serial, force: :cascade do |t| + t.boolean "revoked", default: false + t.boolean "read_repository", default: false, null: false + t.boolean "read_registry", default: false, null: false +@@ -820,7 +820,7 @@ + t.index ["token"], name: "index_deploy_tokens_on_token", unique: true, using: :btree + end + +- create_table "deployments", force: :cascade do |t| ++ create_table "deployments", id: :serial, force: :cascade do |t| + t.integer "iid", null: false + t.integer "project_id", null: false + t.integer "environment_id", null: false +@@ -846,7 +846,7 @@ + t.index ["project_id", "status"], name: "index_deployments_on_project_id_and_status", using: :btree + end + +- create_table "emails", force: :cascade do |t| ++ create_table "emails", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.string "email", null: false + t.datetime "created_at" +@@ -859,7 +859,7 @@ + t.index ["user_id"], name: "index_emails_on_user_id", using: :btree + end + +- create_table "environments", force: :cascade do |t| ++ create_table "environments", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at" +@@ -872,7 +872,7 @@ + t.index ["project_id", "slug"], name: "index_environments_on_project_id_and_slug", unique: true, using: :btree + end + +- create_table "events", force: :cascade do |t| ++ create_table "events", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.integer "author_id", null: false + t.integer "target_id" +@@ -887,7 +887,7 @@ + t.index ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id", using: :btree + end + +- create_table "feature_gates", force: :cascade do |t| ++ create_table "feature_gates", id: :serial, force: :cascade do |t| + t.string "feature_key", null: false + t.string "key", null: false + t.string "value" +@@ -896,14 +896,14 @@ + t.index ["feature_key", "key", "value"], name: "index_feature_gates_on_feature_key_and_key_and_value", unique: true, using: :btree + end + +- create_table "features", force: :cascade do |t| ++ create_table "features", id: :serial, force: :cascade do |t| + t.string "key", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["key"], name: "index_features_on_key", unique: true, using: :btree + end + +- create_table "fork_network_members", force: :cascade do |t| ++ create_table "fork_network_members", id: :serial, force: :cascade do |t| + t.integer "fork_network_id", null: false + t.integer "project_id", null: false + t.integer "forked_from_project_id" +@@ -912,13 +912,13 @@ + t.index ["project_id"], name: "index_fork_network_members_on_project_id", unique: true, using: :btree + end + +- create_table "fork_networks", force: :cascade do |t| ++ create_table "fork_networks", id: :serial, force: :cascade do |t| + t.integer "root_project_id" + t.string "deleted_root_project_name" + t.index ["root_project_id"], name: "index_fork_networks_on_root_project_id", unique: true, using: :btree + end + +- create_table "forked_project_links", force: :cascade do |t| ++ create_table "forked_project_links", id: :serial, force: :cascade do |t| + t.integer "forked_to_project_id", null: false + t.integer "forked_from_project_id", null: false + t.datetime "created_at" +@@ -926,7 +926,7 @@ + t.index ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree + end + +- create_table "gpg_key_subkeys", force: :cascade do |t| ++ create_table "gpg_key_subkeys", id: :serial, force: :cascade do |t| + t.integer "gpg_key_id", null: false + t.binary "keyid" + t.binary "fingerprint" +@@ -935,7 +935,7 @@ + t.index ["keyid"], name: "index_gpg_key_subkeys_on_keyid", unique: true, using: :btree + end + +- create_table "gpg_keys", force: :cascade do |t| ++ create_table "gpg_keys", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id" +@@ -947,7 +947,7 @@ + t.index ["user_id"], name: "index_gpg_keys_on_user_id", using: :btree + end + +- create_table "gpg_signatures", force: :cascade do |t| ++ create_table "gpg_signatures", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "project_id" +@@ -965,7 +965,7 @@ + t.index ["project_id"], name: "index_gpg_signatures_on_project_id", using: :btree + end + +- create_table "group_custom_attributes", force: :cascade do |t| ++ create_table "group_custom_attributes", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "group_id", null: false +@@ -975,7 +975,7 @@ + t.index ["key", "value"], name: "index_group_custom_attributes_on_key_and_value", using: :btree + end + +- create_table "identities", force: :cascade do |t| ++ create_table "identities", id: :serial, force: :cascade do |t| + t.string "extern_uid" + t.string "provider" + t.integer "user_id" +@@ -984,7 +984,7 @@ + t.index ["user_id"], name: "index_identities_on_user_id", using: :btree + end + +- create_table "import_export_uploads", force: :cascade do |t| ++ create_table "import_export_uploads", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "updated_at", null: false + t.integer "project_id" + t.text "import_file" +@@ -993,7 +993,7 @@ + t.index ["updated_at"], name: "index_import_export_uploads_on_updated_at", using: :btree + end + +- create_table "internal_ids", id: :bigserial, force: :cascade do |t| ++ create_table "internal_ids", force: :cascade do |t| + t.integer "project_id" + t.integer "usage", null: false + t.integer "last_value", null: false +@@ -1011,7 +1011,7 @@ + t.index ["user_id"], name: "index_issue_assignees_on_user_id", using: :btree + end + +- create_table "issue_metrics", force: :cascade do |t| ++ create_table "issue_metrics", id: :serial, force: :cascade do |t| + t.integer "issue_id", null: false + t.datetime "first_mentioned_in_commit_at" + t.datetime "first_associated_with_milestone_at" +@@ -1021,7 +1021,7 @@ + t.index ["issue_id"], name: "index_issue_metrics", using: :btree + end + +- create_table "issues", force: :cascade do |t| ++ create_table "issues", id: :serial, force: :cascade do |t| + t.string "title" + t.integer "author_id" + t.integer "project_id" +@@ -1063,7 +1063,7 @@ + t.index ["updated_by_id"], name: "index_issues_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree + end + +- create_table "keys", force: :cascade do |t| ++ create_table "keys", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.datetime "created_at" + t.datetime "updated_at" +@@ -1077,7 +1077,7 @@ + t.index ["user_id"], name: "index_keys_on_user_id", using: :btree + end + +- create_table "label_links", force: :cascade do |t| ++ create_table "label_links", id: :serial, force: :cascade do |t| + t.integer "label_id" + t.integer "target_id" + t.string "target_type" +@@ -1087,7 +1087,7 @@ + t.index ["target_id", "target_type"], name: "index_label_links_on_target_id_and_target_type", using: :btree + end + +- create_table "label_priorities", force: :cascade do |t| ++ create_table "label_priorities", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "label_id", null: false + t.integer "priority", null: false +@@ -1098,7 +1098,7 @@ + t.index ["project_id", "label_id"], name: "index_label_priorities_on_project_id_and_label_id", unique: true, using: :btree + end + +- create_table "labels", force: :cascade do |t| ++ create_table "labels", id: :serial, force: :cascade do |t| + t.string "title" + t.string "color" + t.integer "project_id" +@@ -1117,7 +1117,7 @@ + t.index ["type", "project_id"], name: "index_labels_on_type_and_project_id", using: :btree + end + +- create_table "lfs_file_locks", force: :cascade do |t| ++ create_table "lfs_file_locks", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "user_id", null: false + t.datetime "created_at", null: false +@@ -1126,7 +1126,7 @@ + t.index ["user_id"], name: "index_lfs_file_locks_on_user_id", using: :btree + end + +- create_table "lfs_objects", force: :cascade do |t| ++ create_table "lfs_objects", id: :serial, force: :cascade do |t| + t.string "oid", null: false + t.bigint "size", null: false + t.datetime "created_at" +@@ -1137,7 +1137,7 @@ + t.index ["oid"], name: "index_lfs_objects_on_oid", unique: true, using: :btree + end + +- create_table "lfs_objects_projects", force: :cascade do |t| ++ create_table "lfs_objects_projects", id: :serial, force: :cascade do |t| + t.integer "lfs_object_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" +@@ -1145,7 +1145,7 @@ + t.index ["project_id"], name: "index_lfs_objects_projects_on_project_id", using: :btree + end + +- create_table "lists", force: :cascade do |t| ++ create_table "lists", id: :serial, force: :cascade do |t| + t.integer "board_id", null: false + t.integer "label_id" + t.integer "list_type", default: 1, null: false +@@ -1157,7 +1157,7 @@ + t.index ["list_type"], name: "index_lists_on_list_type", using: :btree + end + +- create_table "members", force: :cascade do |t| ++ create_table "members", id: :serial, force: :cascade do |t| + t.integer "access_level", null: false + t.integer "source_id", null: false + t.string "source_type", null: false +@@ -1212,7 +1212,7 @@ + t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_files_on_mr_diff_id_and_order", unique: true, using: :btree + end + +- create_table "merge_request_diffs", force: :cascade do |t| ++ create_table "merge_request_diffs", id: :serial, force: :cascade do |t| + t.string "state" + t.integer "merge_request_id", null: false + t.datetime "created_at" +@@ -1228,7 +1228,7 @@ + t.index ["merge_request_id", "id"], name: "index_merge_request_diffs_on_merge_request_id_and_id", using: :btree + end + +- create_table "merge_request_metrics", force: :cascade do |t| ++ create_table "merge_request_metrics", id: :serial, force: :cascade do |t| + t.integer "merge_request_id", null: false + t.datetime "latest_build_started_at" + t.datetime "latest_build_finished_at" +@@ -1247,7 +1247,7 @@ + t.index ["pipeline_id"], name: "index_merge_request_metrics_on_pipeline_id", using: :btree + end + +- create_table "merge_requests", force: :cascade do |t| ++ create_table "merge_requests", id: :serial, force: :cascade do |t| + t.string "target_branch", null: false + t.string "source_branch", null: false + t.integer "source_project_id" +@@ -1304,7 +1304,7 @@ + t.index ["updated_by_id"], name: "index_merge_requests_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree + end + +- create_table "merge_requests_closing_issues", force: :cascade do |t| ++ create_table "merge_requests_closing_issues", id: :serial, force: :cascade do |t| + t.integer "merge_request_id", null: false + t.integer "issue_id", null: false + t.datetime "created_at", null: false +@@ -1313,7 +1313,7 @@ + t.index ["merge_request_id"], name: "index_merge_requests_closing_issues_on_merge_request_id", using: :btree + end + +- create_table "milestones", force: :cascade do |t| ++ create_table "milestones", id: :serial, force: :cascade do |t| + t.string "title", null: false + t.integer "project_id" + t.text "description" +@@ -1335,7 +1335,7 @@ + t.index ["title"], name: "index_milestones_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} + end + +- create_table "namespaces", force: :cascade do |t| ++ create_table "namespaces", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "path", null: false + t.integer "owner_id" +@@ -1367,7 +1367,7 @@ + t.index ["type"], name: "index_namespaces_on_type", using: :btree + end + +- create_table "note_diff_files", force: :cascade do |t| ++ create_table "note_diff_files", id: :serial, force: :cascade do |t| + t.integer "diff_note_id", null: false + t.text "diff", null: false + t.boolean "new_file", null: false +@@ -1380,7 +1380,7 @@ + t.index ["diff_note_id"], name: "index_note_diff_files_on_diff_note_id", unique: true, using: :btree + end + +- create_table "notes", force: :cascade do |t| ++ create_table "notes", id: :serial, force: :cascade do |t| + t.text "note" + t.string "noteable_type" + t.integer "author_id" +@@ -1415,7 +1415,7 @@ + t.index ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type", using: :btree + end + +- create_table "notification_settings", force: :cascade do |t| ++ create_table "notification_settings", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "source_id" + t.string "source_type" +@@ -1441,7 +1441,7 @@ + t.index ["user_id"], name: "index_notification_settings_on_user_id", using: :btree + end + +- create_table "oauth_access_grants", force: :cascade do |t| ++ create_table "oauth_access_grants", id: :serial, force: :cascade do |t| + t.integer "resource_owner_id", null: false + t.integer "application_id", null: false + t.string "token", null: false +@@ -1453,7 +1453,7 @@ + t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true, using: :btree + end + +- create_table "oauth_access_tokens", force: :cascade do |t| ++ create_table "oauth_access_tokens", id: :serial, force: :cascade do |t| + t.integer "resource_owner_id" + t.integer "application_id" + t.string "token", null: false +@@ -1467,7 +1467,7 @@ + t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true, using: :btree + end + +- create_table "oauth_applications", force: :cascade do |t| ++ create_table "oauth_applications", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "uid", null: false + t.string "secret", null: false +@@ -1482,13 +1482,13 @@ + t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree + end + +- create_table "oauth_openid_requests", force: :cascade do |t| ++ create_table "oauth_openid_requests", id: :serial, force: :cascade do |t| + t.integer "access_grant_id", null: false + t.string "nonce", null: false + t.index ["access_grant_id"], name: "index_oauth_openid_requests_on_access_grant_id", using: :btree + end + +- create_table "pages_domains", force: :cascade do |t| ++ create_table "pages_domains", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.text "certificate" + t.text "encrypted_key" +@@ -1505,7 +1505,7 @@ + t.index ["verified_at"], name: "index_pages_domains_on_verified_at", using: :btree + end + +- create_table "personal_access_tokens", force: :cascade do |t| ++ create_table "personal_access_tokens", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.string "token" + t.string "name", null: false +@@ -1521,7 +1521,7 @@ + t.index ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree + end + +- create_table "pool_repositories", id: :bigserial, force: :cascade do |t| ++ create_table "pool_repositories", force: :cascade do |t| + t.integer "shard_id", null: false + t.string "disk_path" + t.string "state" +@@ -1531,7 +1531,7 @@ + t.index ["source_project_id"], name: "index_pool_repositories_on_source_project_id", unique: true, using: :btree + end + +- create_table "programming_languages", force: :cascade do |t| ++ create_table "programming_languages", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.string "color", null: false + t.datetime_with_timezone "created_at", null: false +@@ -1546,7 +1546,7 @@ + t.index ["user_id", "project_id", "access_level"], name: "index_project_authorizations_on_user_id_project_id_access_level", unique: true, using: :btree + end + +- create_table "project_auto_devops", force: :cascade do |t| ++ create_table "project_auto_devops", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false +@@ -1556,13 +1556,13 @@ + t.index ["project_id"], name: "index_project_auto_devops_on_project_id", unique: true, using: :btree + end + +- create_table "project_ci_cd_settings", force: :cascade do |t| ++ create_table "project_ci_cd_settings", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.boolean "group_runners_enabled", default: true, null: false + t.index ["project_id"], name: "index_project_ci_cd_settings_on_project_id", unique: true, using: :btree + end + +- create_table "project_custom_attributes", force: :cascade do |t| ++ create_table "project_custom_attributes", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "project_id", null: false +@@ -1572,7 +1572,7 @@ + t.index ["project_id", "key"], name: "index_project_custom_attributes_on_project_id_and_key", unique: true, using: :btree + end + +- create_table "project_deploy_tokens", force: :cascade do |t| ++ create_table "project_deploy_tokens", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "deploy_token_id", null: false + t.datetime_with_timezone "created_at", null: false +@@ -1580,7 +1580,7 @@ + t.index ["project_id", "deploy_token_id"], name: "index_project_deploy_tokens_on_project_id_and_deploy_token_id", unique: true, using: :btree + end + +- create_table "project_error_tracking_settings", primary_key: "project_id", id: :integer, force: :cascade do |t| ++ create_table "project_error_tracking_settings", primary_key: "project_id", id: :integer, default: nil, force: :cascade do |t| + t.boolean "enabled", default: false, null: false + t.string "api_url" + t.string "encrypted_token" +@@ -1589,7 +1589,7 @@ + t.string "organization_name" + end + +- create_table "project_features", force: :cascade do |t| ++ create_table "project_features", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "merge_requests_access_level" + t.integer "issues_access_level" +@@ -1603,7 +1603,7 @@ + t.index ["project_id"], name: "index_project_features_on_project_id", unique: true, using: :btree + end + +- create_table "project_group_links", force: :cascade do |t| ++ create_table "project_group_links", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "group_id", null: false + t.datetime "created_at" +@@ -1614,7 +1614,7 @@ + t.index ["project_id"], name: "index_project_group_links_on_project_id", using: :btree + end + +- create_table "project_import_data", force: :cascade do |t| ++ create_table "project_import_data", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.text "data" + t.text "encrypted_credentials" +@@ -1623,7 +1623,7 @@ + t.index ["project_id"], name: "index_project_import_data_on_project_id", using: :btree + end + +- create_table "project_mirror_data", force: :cascade do |t| ++ create_table "project_mirror_data", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "status" + t.string "jid" +@@ -1633,7 +1633,7 @@ + t.index ["status"], name: "index_project_mirror_data_on_status", using: :btree + end + +- create_table "project_repositories", id: :bigserial, force: :cascade do |t| ++ create_table "project_repositories", force: :cascade do |t| + t.integer "shard_id", null: false + t.string "disk_path", null: false + t.integer "project_id", null: false +@@ -1642,7 +1642,7 @@ + t.index ["shard_id"], name: "index_project_repositories_on_shard_id", using: :btree + end + +- create_table "project_statistics", force: :cascade do |t| ++ create_table "project_statistics", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "namespace_id", null: false + t.bigint "commit_count", default: 0, null: false +@@ -1654,7 +1654,7 @@ + t.index ["project_id"], name: "index_project_statistics_on_project_id", unique: true, using: :btree + end + +- create_table "projects", force: :cascade do |t| ++ create_table "projects", id: :serial, force: :cascade do |t| + t.string "name" + t.string "path" + t.text "description" +@@ -1731,7 +1731,7 @@ + t.index ["visibility_level"], name: "index_projects_on_visibility_level", using: :btree + end + +- create_table "prometheus_metrics", force: :cascade do |t| ++ create_table "prometheus_metrics", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.string "title", null: false + t.string "query", null: false +@@ -1749,7 +1749,7 @@ + t.index ["project_id"], name: "index_prometheus_metrics_on_project_id", using: :btree + end + +- create_table "protected_branch_merge_access_levels", force: :cascade do |t| ++ create_table "protected_branch_merge_access_levels", id: :serial, force: :cascade do |t| + t.integer "protected_branch_id", null: false + t.integer "access_level", default: 40, null: false + t.datetime "created_at", null: false +@@ -1757,7 +1757,7 @@ + t.index ["protected_branch_id"], name: "index_protected_branch_merge_access", using: :btree + end + +- create_table "protected_branch_push_access_levels", force: :cascade do |t| ++ create_table "protected_branch_push_access_levels", id: :serial, force: :cascade do |t| + t.integer "protected_branch_id", null: false + t.integer "access_level", default: 40, null: false + t.datetime "created_at", null: false +@@ -1765,7 +1765,7 @@ + t.index ["protected_branch_id"], name: "index_protected_branch_push_access", using: :btree + end + +- create_table "protected_branches", force: :cascade do |t| ++ create_table "protected_branches", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at" +@@ -1773,7 +1773,7 @@ + t.index ["project_id"], name: "index_protected_branches_on_project_id", using: :btree + end + +- create_table "protected_tag_create_access_levels", force: :cascade do |t| ++ create_table "protected_tag_create_access_levels", id: :serial, force: :cascade do |t| + t.integer "protected_tag_id", null: false + t.integer "access_level", default: 40 + t.integer "user_id" +@@ -1785,7 +1785,7 @@ + t.index ["user_id"], name: "index_protected_tag_create_access_levels_on_user_id", using: :btree + end + +- create_table "protected_tags", force: :cascade do |t| ++ create_table "protected_tags", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.string "name", null: false + t.datetime "created_at", null: false +@@ -1806,7 +1806,7 @@ + t.index ["event_id"], name: "index_push_event_payloads_on_event_id", unique: true, using: :btree + end + +- create_table "redirect_routes", force: :cascade do |t| ++ create_table "redirect_routes", id: :serial, force: :cascade do |t| + t.integer "source_id", null: false + t.string "source_type", null: false + t.string "path", null: false +@@ -1816,7 +1816,7 @@ + t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id", using: :btree + end + +- create_table "release_links", id: :bigserial, force: :cascade do |t| ++ create_table "release_links", force: :cascade do |t| + t.integer "release_id", null: false + t.string "url", null: false + t.string "name", null: false +@@ -1826,7 +1826,7 @@ + t.index ["release_id", "url"], name: "index_release_links_on_release_id_and_url", unique: true, using: :btree + end + +- create_table "releases", force: :cascade do |t| ++ create_table "releases", id: :serial, force: :cascade do |t| + t.string "tag" + t.text "description" + t.integer "project_id" +@@ -1842,7 +1842,7 @@ + t.index ["project_id"], name: "index_releases_on_project_id", using: :btree + end + +- create_table "remote_mirrors", force: :cascade do |t| ++ create_table "remote_mirrors", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.string "url" + t.boolean "enabled", default: false +@@ -1870,7 +1870,7 @@ + t.index ["project_id", "programming_language_id"], name: "index_repository_languages_on_project_and_languages_id", unique: true, using: :btree + end + +- create_table "resource_label_events", id: :bigserial, force: :cascade do |t| ++ create_table "resource_label_events", force: :cascade do |t| + t.integer "action", null: false + t.integer "issue_id" + t.integer "merge_request_id" +@@ -1886,7 +1886,7 @@ + t.index ["user_id"], name: "index_resource_label_events_on_user_id", using: :btree + end + +- create_table "routes", force: :cascade do |t| ++ create_table "routes", id: :serial, force: :cascade do |t| + t.integer "source_id", null: false + t.string "source_type", null: false + t.string "path", null: false +@@ -1898,7 +1898,7 @@ + t.index ["source_type", "source_id"], name: "index_routes_on_source_type_and_source_id", unique: true, using: :btree + end + +- create_table "sent_notifications", force: :cascade do |t| ++ create_table "sent_notifications", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.integer "noteable_id" + t.string "noteable_type" +@@ -1912,7 +1912,7 @@ + t.index ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true, using: :btree + end + +- create_table "services", force: :cascade do |t| ++ create_table "services", id: :serial, force: :cascade do |t| + t.string "type" + t.string "title" + t.integer "project_id" +@@ -1938,12 +1938,12 @@ + t.index ["template"], name: "index_services_on_template", using: :btree + end + +- create_table "shards", force: :cascade do |t| ++ create_table "shards", id: :serial, force: :cascade do |t| + t.string "name", null: false + t.index ["name"], name: "index_shards_on_name", unique: true, using: :btree + end + +- create_table "snippets", force: :cascade do |t| ++ create_table "snippets", id: :serial, force: :cascade do |t| + t.string "title" + t.text "content" + t.integer "author_id", null: false +@@ -1966,7 +1966,7 @@ + t.index ["visibility_level"], name: "index_snippets_on_visibility_level", using: :btree + end + +- create_table "spam_logs", force: :cascade do |t| ++ create_table "spam_logs", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.string "source_ip" + t.string "user_agent" +@@ -1980,7 +1980,7 @@ + t.boolean "recaptcha_verified", default: false, null: false + end + +- create_table "subscriptions", force: :cascade do |t| ++ create_table "subscriptions", id: :serial, force: :cascade do |t| + t.integer "user_id" + t.integer "subscribable_id" + t.string "subscribable_type" +@@ -1992,7 +1992,7 @@ + t.index ["subscribable_id", "subscribable_type", "user_id", "project_id"], name: "index_subscriptions_on_subscribable_and_user_id_and_project_id", unique: true, using: :btree + end + +- create_table "suggestions", id: :bigserial, force: :cascade do |t| ++ create_table "suggestions", force: :cascade do |t| + t.integer "note_id", null: false + t.integer "relative_order", limit: 2, null: false + t.boolean "applied", default: false, null: false +@@ -2002,7 +2002,7 @@ + t.index ["note_id", "relative_order"], name: "index_suggestions_on_note_id_and_relative_order", unique: true, using: :btree + end + +- create_table "system_note_metadata", force: :cascade do |t| ++ create_table "system_note_metadata", id: :serial, force: :cascade do |t| + t.integer "note_id", null: false + t.integer "commit_count" + t.string "action" +@@ -2011,7 +2011,7 @@ + t.index ["note_id"], name: "index_system_note_metadata_on_note_id", unique: true, using: :btree + end + +- create_table "taggings", force: :cascade do |t| ++ create_table "taggings", id: :serial, force: :cascade do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" +@@ -2025,13 +2025,13 @@ + t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type", using: :btree + end + +- create_table "tags", force: :cascade do |t| ++ create_table "tags", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "taggings_count", default: 0 + t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree + end + +- create_table "term_agreements", force: :cascade do |t| ++ create_table "term_agreements", id: :serial, force: :cascade do |t| + t.integer "term_id", null: false + t.integer "user_id", null: false + t.boolean "accepted", default: false, null: false +@@ -2042,7 +2042,7 @@ + t.index ["user_id"], name: "index_term_agreements_on_user_id", using: :btree + end + +- create_table "timelogs", force: :cascade do |t| ++ create_table "timelogs", id: :serial, force: :cascade do |t| + t.integer "time_spent", null: false + t.integer "user_id" + t.datetime "created_at", null: false +@@ -2055,7 +2055,7 @@ + t.index ["user_id"], name: "index_timelogs_on_user_id", using: :btree + end + +- create_table "todos", force: :cascade do |t| ++ create_table "todos", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "project_id" + t.integer "target_id" +@@ -2079,12 +2079,12 @@ + t.index ["user_id"], name: "index_todos_on_user_id", using: :btree + end + +- create_table "trending_projects", force: :cascade do |t| ++ create_table "trending_projects", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.index ["project_id"], name: "index_trending_projects_on_project_id", unique: true, using: :btree + end + +- create_table "u2f_registrations", force: :cascade do |t| ++ create_table "u2f_registrations", id: :serial, force: :cascade do |t| + t.text "certificate" + t.string "key_handle" + t.string "public_key" +@@ -2097,7 +2097,7 @@ + t.index ["user_id"], name: "index_u2f_registrations_on_user_id", using: :btree + end + +- create_table "uploads", force: :cascade do |t| ++ create_table "uploads", id: :serial, force: :cascade do |t| + t.bigint "size", null: false + t.string "path", limit: 511, null: false + t.string "checksum", limit: 64 +@@ -2114,7 +2114,7 @@ + t.index ["uploader", "path"], name: "index_uploads_on_uploader_and_path", using: :btree + end + +- create_table "user_agent_details", force: :cascade do |t| ++ create_table "user_agent_details", id: :serial, force: :cascade do |t| + t.string "user_agent", null: false + t.string "ip_address", null: false + t.integer "subject_id", null: false +@@ -2125,14 +2125,14 @@ + t.index ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type", using: :btree + end + +- create_table "user_callouts", force: :cascade do |t| ++ create_table "user_callouts", id: :serial, force: :cascade do |t| + t.integer "feature_name", null: false + t.integer "user_id", null: false + t.index ["user_id", "feature_name"], name: "index_user_callouts_on_user_id_and_feature_name", unique: true, using: :btree + t.index ["user_id"], name: "index_user_callouts_on_user_id", using: :btree + end + +- create_table "user_custom_attributes", force: :cascade do |t| ++ create_table "user_custom_attributes", id: :serial, force: :cascade do |t| + t.datetime_with_timezone "created_at", null: false + t.datetime_with_timezone "updated_at", null: false + t.integer "user_id", null: false +@@ -2149,7 +2149,7 @@ + t.index ["user_id"], name: "index_user_interacted_projects_on_user_id", using: :btree + end + +- create_table "user_preferences", force: :cascade do |t| ++ create_table "user_preferences", id: :serial, force: :cascade do |t| + t.integer "user_id", null: false + t.integer "issue_notes_filter", limit: 2, default: 0, null: false + t.integer "merge_request_notes_filter", limit: 2, default: 0, null: false +@@ -2161,7 +2161,7 @@ + t.index ["user_id"], name: "index_user_preferences_on_user_id", unique: true, using: :btree + end + +- create_table "user_statuses", primary_key: "user_id", force: :cascade do |t| ++ create_table "user_statuses", primary_key: "user_id", id: :serial, force: :cascade do |t| + t.integer "cached_markdown_version" + t.string "emoji", default: "speech_balloon", null: false + t.string "message", limit: 100 +@@ -2169,7 +2169,7 @@ + t.index ["user_id"], name: "index_user_statuses_on_user_id", using: :btree + end + +- create_table "user_synced_attributes_metadata", force: :cascade do |t| ++ create_table "user_synced_attributes_metadata", id: :serial, force: :cascade do |t| + t.boolean "name_synced", default: false + t.boolean "email_synced", default: false + t.boolean "location_synced", default: false +@@ -2178,7 +2178,7 @@ + t.index ["user_id"], name: "index_user_synced_attributes_metadata_on_user_id", unique: true, using: :btree + end + +- create_table "users", force: :cascade do |t| ++ create_table "users", id: :serial, force: :cascade do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" +@@ -2264,7 +2264,7 @@ + t.index ["username"], name: "index_users_on_username_trigram", using: :gin, opclasses: {"username"=>"gin_trgm_ops"} + end + +- create_table "users_star_projects", force: :cascade do |t| ++ create_table "users_star_projects", id: :serial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "user_id", null: false + t.datetime "created_at" +@@ -2273,7 +2273,7 @@ + t.index ["user_id", "project_id"], name: "index_users_star_projects_on_user_id_and_project_id", unique: true, using: :btree + end + +- create_table "web_hook_logs", force: :cascade do |t| ++ create_table "web_hook_logs", id: :serial, force: :cascade do |t| + t.integer "web_hook_id", null: false + t.string "trigger" + t.string "url" +@@ -2290,7 +2290,7 @@ + t.index ["web_hook_id"], name: "index_web_hook_logs_on_web_hook_id", using: :btree + end + +- create_table "web_hooks", force: :cascade do |t| ++ create_table "web_hooks", id: :serial, force: :cascade do |t| + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" +--- a/lib/gitlab/performance_bar/peek_query_tracker.rb ++++ b/lib/gitlab/performance_bar/peek_query_tracker.rb +@@ -26,11 +26,7 @@ + + subscribe('sql.active_record') do |_, start, finish, _, data| + if Gitlab::SafeRequestStore.store[:peek_enabled] +- # data[:cached] is only available starting from Rails 5.1.0 +- # https://github.com/rails/rails/blob/v5.1.0/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb#L113 +- # Before that, data[:name] was set to 'CACHE' +- # https://github.com/rails/rails/blob/v4.2.9/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb#L80 +- unless data.fetch(:cached, data[:name] == 'CACHE') ++ unless data[:cached] + track_query(data[:sql].strip, data[:binds], start, finish) + end + end +--- a/lib/gitlab/search_results.rb ++++ b/lib/gitlab/search_results.rb +@@ -99,7 +99,7 @@ + issues.full_search(query) + end + +- issues.reorder('updated_at DESC') ++ issues.reorder('issues.updated_at DESC') + end + # rubocop: enable CodeReuse/ActiveRecord + +@@ -107,7 +107,7 @@ + def milestones + milestones = Milestone.where(project_id: project_ids_relation) + milestones = milestones.search(query) +- milestones.reorder('updated_at DESC') ++ milestones.reorder('milestones.updated_at DESC') + end + # rubocop: enable CodeReuse/ActiveRecord + +@@ -125,7 +125,7 @@ + merge_requests.full_search(query) + end + +- merge_requests.reorder('updated_at DESC') ++ merge_requests.reorder('merge_requests.updated_at DESC') + end + # rubocop: enable CodeReuse/ActiveRecord + +--- a/spec/fixtures/api/schemas/entities/issue.json ++++ b/spec/fixtures/api/schemas/entities/issue.json +@@ -5,7 +5,7 @@ + "iid": { "type": "integer" }, + "author_id": { "type": "integer" }, + "description": { "type": ["string", "null"] }, +- "lock_version": { "type": ["string", "null"] }, ++ "lock_version": { "type": ["integer", "null"] }, + "milestone_id": { "type": ["string", "null"] }, + "title": { "type": "string" }, + "moved_to_id": { "type": ["integer", "null"] }, +--- a/spec/fixtures/api/schemas/entities/merge_request_basic.json ++++ b/spec/fixtures/api/schemas/entities/merge_request_basic.json +@@ -23,7 +23,7 @@ + }, + "task_status": { "type": "string" }, + "task_status_short": { "type": "string" }, +- "lock_version": { "type": ["string", "null"] } ++ "lock_version": { "type": ["integer", "null"] } + }, + "additionalProperties": false + } +--- a/spec/javascripts/merge_request_spec.js ++++ b/spec/javascripts/merge_request_spec.js +@@ -58,7 +58,7 @@ + { + merge_request: { + description: '- [ ] Task List Item', +- lock_version: undefined, ++ lock_version: 0, + update_task: { line_number: lineNumber, line_source: lineSource, index, checked }, + }, + }, +--- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb ++++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb +@@ -179,7 +179,7 @@ + end + + before do +- allow_any_instance_of(described_class::MergeRequestDiff::ActiveRecord_Relation) ++ allow_any_instance_of(ActiveRecord::Relation) + .to receive(:update_all).and_raise(exception) + end + +--- a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb ++++ b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb +@@ -29,7 +29,7 @@ + it 'has no new columns' do + relation_names.each do |relation_name| + relation_class = relation_class_for_name(relation_name) +- relation_attributes = relation_class.new.attributes.keys ++ relation_attributes = relation_class.new.attributes.keys - relation_class.encrypted_attributes.keys.map(&:to_s) + + current_attributes = parsed_attributes(relation_name, relation_attributes) + safe_attributes = safe_model_attributes[relation_class.to_s].dup || [] +--- a/spec/models/ci/runner_spec.rb ++++ b/spec/models/ci/runner_spec.rb +@@ -71,9 +71,8 @@ + end + + it 'should fail to save a group assigned to a project runner even if the runner is already saved' do +- group_runner +- +- expect { create(:group, runners: [project_runner]) } ++ group.runners << project_runner ++ expect { group.save! } + .to raise_error(ActiveRecord::RecordInvalid) + end + end +--- a/spec/requests/api/runner_spec.rb ++++ b/spec/requests/api/runner_spec.rb +@@ -68,7 +68,7 @@ + post api('/runners'), params: { token: group.runners_token } + + expect(response).to have_http_status 201 +- expect(group.runners.size).to eq(1) ++ expect(group.runners.reload.size).to eq(1) + runner = Ci::Runner.first + expect(runner.token).not_to eq(registration_token) + expect(runner.token).not_to eq(group.runners_token) +--- a/spec/requests/rack_attack_global_spec.rb ++++ b/spec/requests/rack_attack_global_spec.rb +@@ -251,8 +251,8 @@ + let(:throttle_setting_prefix) { 'throttle_authenticated_web' } + + context 'with the token in the query string' do +- let(:get_args) { [rss_url(user), nil] } +- let(:other_user_get_args) { [rss_url(other_user), nil] } ++ let(:get_args) { [rss_url(user), params: nil] } ++ let(:other_user_get_args) { [rss_url(other_user), params: nil] } + + it_behaves_like 'rate-limited token-authenticated requests' + end +--- a/spec/services/users/destroy_service_spec.rb ++++ b/spec/services/users/destroy_service_spec.rb +@@ -208,6 +208,8 @@ + + describe "calls the before/after callbacks" do + it 'of project_members' do ++ expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:find).once ++ expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:initialize).once + expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:destroy).once + + service.execute(user) +@@ -217,6 +219,8 @@ + group_member = create(:group_member) + group_member.group.group_members.create(user: user, access_level: 40) + ++ expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:find).once ++ expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:initialize).once + expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:destroy).once + + service.execute(user) +--- a/spec/services/users/migrate_to_ghost_user_service_spec.rb ++++ b/spec/services/users/migrate_to_ghost_user_service_spec.rb +@@ -78,7 +78,7 @@ + + context "when record migration fails with a rollback exception" do + before do +- expect_any_instance_of(MergeRequest::ActiveRecord_Associations_CollectionProxy) ++ expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) + .to receive(:update_all).and_raise(ActiveRecord::Rollback) + end + +--- a/spec/support/helpers/query_recorder.rb ++++ b/spec/support/helpers/query_recorder.rb +@@ -17,7 +17,7 @@ + def callback(name, start, finish, message_id, values) + show_backtrace(values) if ENV['QUERY_RECORDER_DEBUG'] + +- if values[:name]&.include?("CACHE") && skip_cached ++ if values[:cached] && skip_cached + @cached << values[:sql] + elsif !values[:name]&.include?("SCHEMA") + @log << values[:sql] +--- a/spec/support/helpers/test_request_helpers.rb ++++ b/spec/support/helpers/test_request_helpers.rb +@@ -1,7 +1,7 @@ + # frozen_string_literal: true + + module TestRequestHelpers +- def test_request(remote_ip: '127.0.0.1') +- ActionController::TestRequest.new({ remote_ip: remote_ip }, ActionController::TestSession.new) ++ def test_request(remote_ip: '127.0.0.1', controller: nil) ++ ActionController::TestRequest.new({ remote_ip: remote_ip }, ActionController::TestSession.new, controller) + end + end +--- a/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb ++++ b/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb +@@ -45,7 +45,7 @@ + context "race conditions" do + context "when #{record_class_name} migration fails and is rolled back" do + before do +- expect_any_instance_of(record_class::ActiveRecord_Associations_CollectionProxy) ++ expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) + .to receive(:update_all).and_raise(ActiveRecord::Rollback) + end + +@@ -66,7 +66,7 @@ + + context "when #{record_class_name} migration fails with a non-rollback exception" do + before do +- expect_any_instance_of(record_class::ActiveRecord_Associations_CollectionProxy) ++ expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) + .to receive(:update_all).and_raise(ArgumentError) + end + diff --git a/debian/patches/0680-rails-5_2.patch b/debian/patches/0680-rails-5_2.patch deleted file mode 100644 index e522f31b19..0000000000 --- a/debian/patches/0680-rails-5_2.patch +++ /dev/null @@ -1,268 +0,0 @@ -From d2b436376c92a86859c19d66eb395c2ef2ac977b Mon Sep 17 00:00:00 2001 -From: Jan Provaznik -Date: Mon, 17 Dec 2018 11:31:36 +0100 -Subject: [PATCH 1/6] Upgrade to rails 5.2 - ---- - Gemfile | 6 +- - Gemfile.lock | 111 +++++++++--------- - .../active_record_verbose_query_logs.rb | 56 --------- - 3 files changed, 61 insertions(+), 112 deletions(-) - delete mode 100644 config/initializers/active_record_verbose_query_logs.rb - ---- a/Gemfile -+++ b/Gemfile -@@ -20,7 +20,7 @@ - gem 'pg', '~> 1.1' if ENV["DB"] == "all" || ENV["DB"] == "postgres" - - gem 'rugged', '~> 0.27' --gem 'grape-path-helpers', '~> 1.0' -+gem 'grape-path-helpers', '~> 1.1' - - gem 'faraday', '~> 0.12' - ---- a/Gemfile.lock -+++ b/Gemfile.lock -@@ -52,7 +52,7 @@ - public_suffix (>= 2.0.2, < 4.0) - aes_key_wrap (1.0.1) - akismet (2.0.0) -- arel (7.1.4) -+ arel (9.0.0) - asana (0.8.1) - faraday (~> 0.9) - faraday_middleware (~> 0.9) -@@ -184,7 +184,6 @@ - encryptor (3.0.0) - equalizer (0.0.11) - erubi (1.7.1) -- erubis (2.7.0) - escape_utils (1.2.1) - et-orbi (1.1.7) - tzinfo -@@ -254,8 +253,8 @@ - fog-xml (0.1.3) - fog-core - nokogiri (>= 1.5.11, < 2.0.0) -- font-awesome-rails (4.7.0.1) -- railties (>= 3.2, < 5.1) -+ font-awesome-rails (4.7.0.4) -+ railties (>= 3.2, < 6.0) - foreman (0.84.0) - thor (~> 0.19.1) - formatador (0.2.5) -@@ -330,8 +329,8 @@ - grape-entity (0.7.1) - activesupport (>= 4.0) - multi_json (>= 1.3.2) -- grape-path-helpers (1.0.6) -- activesupport (>= 4, < 5.1) -+ grape-path-helpers (1.1.0) -+ activesupport - grape (~> 1.0) - rake (~> 12) - grape_logging (1.7.0) -@@ -934,7 +933,7 @@ - hashdiff - webpack-rails (0.9.11) - railties (>= 3.2.0) -- websocket-driver (0.6.5) -+ websocket-driver (0.7.0) - websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.3) - wikicloth (0.8.1) -@@ -1033,7 +1032,7 @@ - gpgme (~> 2.0.18) - grape (~> 1.1.0) - grape-entity (~> 0.7.1) -- grape-path-helpers (~> 1.0) -+ grape-path-helpers (~> 1.1) - grape_logging (~> 1.7) - graphiql-rails (~> 1.4.10) - graphql (~> 1.8.0) ---- a/config/initializers/active_record_verbose_query_logs.rb -+++ /dev/null -@@ -1,56 +0,0 @@ --# frozen_string_literal: true -- --# This is backport of https://github.com/rails/rails/pull/26815/files --# Enabled by default for every non-production environment -- --module ActiveRecord -- class LogSubscriber -- module VerboseQueryLogs -- def debug(progname = nil, &block) -- return unless super -- -- log_query_source -- end -- -- def log_query_source -- source_line, line_number = extract_callstack(caller_locations) -- -- if source_line -- if defined?(::Rails.root) -- app_root = "#{::Rails.root}/".freeze -- source_line = source_line.sub(app_root, "") -- end -- -- logger.debug(" ↳ #{source_line}:#{line_number}") -- end -- end -- -- def extract_callstack(callstack) -- line = callstack.find do |frame| -- frame.absolute_path && !ignored_callstack(frame.absolute_path) -- end -- -- offending_line = line || callstack.first -- [ -- offending_line.path, -- offending_line.lineno, -- offending_line.label -- ] -- end -- -- LOG_SUBSCRIBER_FILE = ActiveRecord::LogSubscriber.method(:logger).source_location.first -- RAILS_GEM_ROOT = File.expand_path("../../../..", LOG_SUBSCRIBER_FILE) + "/" -- APP_CONFIG_ROOT = File.expand_path("..", __dir__) + "/" -- -- def ignored_callstack(path) -- path.start_with?(APP_CONFIG_ROOT, RAILS_GEM_ROOT, RbConfig::CONFIG["rubylibdir"]) -- end -- end -- -- if Rails.version.start_with?("5.2") -- raise "Remove this monkey patch: #{__FILE__}" -- else -- prepend(VerboseQueryLogs) unless Rails.env.production? -- end -- end --end ---- a/app/models/ci/job_artifact.rb -+++ b/app/models/ci/job_artifact.rb -@@ -25,7 +25,7 @@ - }.freeze - - TYPE_AND_FORMAT_PAIRS = { -- archive: :zip, -+ archive: :zip_file, - metadata: :gzip, - trace: :raw, - junit: :gzip, -@@ -93,7 +93,7 @@ - - enum file_format: { - raw: 1, -- zip: 2, -+ zip_file: 2, # FIXME - gzip: 3 - } - ---- a/config/initializers/active_record_data_types.rb -+++ b/config/initializers/active_record_data_types.rb -@@ -22,7 +22,7 @@ - # - # When schema dumping, `timestamptz` columns will be output as - # `t.datetime_with_timezone`. -- def initialize_type_map(mapping) -+ def initialize_type_map(mapping = type_map) - super mapping - - mapping.register_type 'timestamptz' do |_, _, sql_type| ---- a/config/initializers/ar_speed_up_migration_checking.rb -+++ b/config/initializers/ar_speed_up_migration_checking.rb -@@ -1,18 +1,18 @@ --if Rails.env.test? -- require 'active_record/migration' -- -- module ActiveRecord -- class Migrator -- class << self -- alias_method :migrations_unmemoized, :migrations -- -- # This method is called a large number of times per rspec example, and -- # it reads + parses `db/migrate/*` each time. Memoizing it can save 0.5 -- # seconds per spec. -- def migrations(paths) -- (@migrations ||= migrations_unmemoized(paths)).dup -- end -- end -- end -- end --end -+#if Rails.env.test? -+# require 'active_record/migration' -+# -+# module ActiveRecord -+# class Migrator -+# class << self -+# alias_method :migrations_unmemoized, :migrations -+# -+# # This method is called a large number of times per rspec example, and -+# # it reads + parses `db/migrate/*` each time. Memoizing it can save 0.5 -+# # seconds per spec. -+# def migrations(paths) -+# (@migrations ||= migrations_unmemoized(paths)).dup -+# end -+# end -+# end -+# end -+#end ---- a/config/initializers/postgresql_cte.rb -+++ b/config/initializers/postgresql_cte.rb -@@ -94,8 +94,8 @@ - end - end - -- def build_arel -- arel = super() -+ def build_arel(aliases) -+ arel = super(aliases) - - build_with(arel) if @values[:with] - ---- a/lib/api/runner.rb -+++ b/lib/api/runner.rb -@@ -243,7 +243,7 @@ - optional :artifact_type, type: String, desc: %q(The type of artifact), - default: 'archive', values: Ci::JobArtifact.file_types.keys - optional :artifact_format, type: String, desc: %q(The format of artifact), -- default: 'zip', values: Ci::JobArtifact.file_formats.keys -+ default: 'zip_file', values: Ci::JobArtifact.file_formats.keys - optional 'file.path', type: String, desc: %q(path to locally stored body (generated by Workhorse)) - optional 'file.name', type: String, desc: %q(real filename as send in Content-Disposition (generated by Workhorse)) - optional 'file.type', type: String, desc: %q(real content type as send in Content-Type (generated by Workhorse)) ---- a/config/initializers/active_record_preloader.rb -+++ b/config/initializers/active_record_preloader.rb -@@ -1,15 +1,15 @@ --module ActiveRecord -- module Associations -- class Preloader -- module NoCommitPreloader -- def preloader_for(reflection, owners, rhs_klass) -- return NullPreloader if rhs_klass == ::Commit -- -- super -- end -- end -- -- prepend NoCommitPreloader -- end -- end --end -+#module ActiveRecord -+# module Associations -+# class Preloader -+# module NoCommitPreloader -+# def preloader_for(reflection, owners, rhs_klass) -+# return NullPreloader if rhs_klass == ::Commit -+# -+# super -+# end -+# end -+# -+# prepend NoCommitPreloader -+# end -+# end -+#end diff --git a/debian/patches/series b/debian/patches/series index 77a2f8987f..dbce745c95 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -21,7 +21,7 @@ 0640-relax-ruby-version.patch 0660-fix-gitlab-yml-path.patch 0670-allow-doorkeepr-4_3.patch -0680-rails-5_2.patch +0680-rails-5_1.patch 0685-bump-fog.patch 0690-debian-usage-ping.patch 0700-add-salsa-link-to-help.patch