diff options
author | Jasper Maes <jaspermaes.jm@gmail.com> | 2019-01-15 22:05:36 +0100 |
---|---|---|
committer | Heinrich Lee Yu <heinrich@gitlab.com> | 2019-04-23 08:31:23 +0800 |
commit | 624a1cdab4da67c7b363602aa1178d0e6ff63475 (patch) | |
tree | 09892175f885c4c5f6725314b25a61280395efcb /config | |
parent | 46bdbc5d776a0438366426e0ef48911123311744 (diff) | |
download | gitlab-ce-624a1cdab4da67c7b363602aa1178d0e6ff63475.tar.gz |
Upgrade Rails to 5.1.6.1
Model.new.attributes now also returns encrypted attributes.
Diffstat (limited to 'config')
-rw-r--r-- | config/application.rb | 3 | ||||
-rw-r--r-- | config/initializers/active_record_attr_mutation_tracker.rb | 16 | ||||
-rw-r--r-- | config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb | 94 | ||||
-rw-r--r-- | config/initializers/active_record_becomes.rb | 29 | ||||
-rw-r--r-- | config/initializers/active_record_build_select.rb | 22 | ||||
-rw-r--r-- | config/initializers/active_record_locking.rb | 76 | ||||
-rw-r--r-- | config/initializers/ar_native_database_types.rb | 3 | ||||
-rw-r--r-- | config/initializers/postgresql_opclasses_support.rb | 2 |
8 files changed, 70 insertions, 175 deletions
diff --git a/config/application.rb b/config/application.rb index cbcfef34e01..cddd91f267a 100644 --- a/config/application.rb +++ b/config/application.rb @@ -164,9 +164,6 @@ module Gitlab # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0' - # 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' diff --git a/config/initializers/active_record_attr_mutation_tracker.rb b/config/initializers/active_record_attr_mutation_tracker.rb new file mode 100644 index 00000000000..0fd2ce56f2c --- /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 diff --git a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb b/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb deleted file mode 100644 index 228ced32188..00000000000 --- 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 <top (required)>' -# # ./spec/requests/api/users_spec.rb:908:in `block (4 levels) in <top (required)>' -# # ------------------ -# # --- Caused by: --- -# # TypeError: -# # TypeError -# # ./spec/requests/api/users_spec.rb:7:in `block (2 levels) in <top (required)>' -# -# 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 diff --git a/config/initializers/active_record_becomes.rb b/config/initializers/active_record_becomes.rb new file mode 100644 index 00000000000..ec4799deeef --- /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 diff --git a/config/initializers/active_record_build_select.rb b/config/initializers/active_record_build_select.rb new file mode 100644 index 00000000000..d072f272e3c --- /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 diff --git a/config/initializers/active_record_locking.rb b/config/initializers/active_record_locking.rb deleted file mode 100644 index 1bd1a12e4b7..00000000000 --- 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 diff --git a/config/initializers/ar_native_database_types.rb b/config/initializers/ar_native_database_types.rb index 3522b1db536..6d397661f75 100644 --- a/config/initializers/ar_native_database_types.rb +++ b/config/initializers/ar_native_database_types.rb @@ -4,7 +4,8 @@ module ActiveRecord 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 diff --git a/config/initializers/postgresql_opclasses_support.rb b/config/initializers/postgresql_opclasses_support.rb index b066f3788ec..7e912180820 100644 --- a/config/initializers/postgresql_opclasses_support.rb +++ b/config/initializers/postgresql_opclasses_support.rb @@ -78,7 +78,7 @@ module ActiveRecord 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(", ") |