Commit d986aea3f085daafc52f4a8d8de8618eeaf01df4

Authored by Dmitriy Zaporozhets
2 parents 9e924c70 18b1f171

Merge branch 'upgrade_to_rails_4.1' into 'master'

Upgrade to rails 4.1
Gemfile
... ... @@ -8,7 +8,7 @@ def linux_only(require_as)
8 8 RUBY_PLATFORM.include?('linux') && require_as
9 9 end
10 10  
11   -gem "rails", "~> 4.0.0"
  11 +gem "rails", "~> 4.1.0"
12 12  
13 13 gem "protected_attributes"
14 14 gem 'rails-observers'
... ... @@ -207,7 +207,7 @@ group :development, :test do
207 207 gem 'factory_girl_rails'
208 208  
209 209 # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826)
210   - gem 'minitest', '~> 4.7.0'
  210 + gem 'minitest', '~> 5.3.0'
211 211  
212 212 # Generate Fake data
213 213 gem "ffaker"
... ... @@ -224,7 +224,7 @@ group :development, :test do
224 224 # PhantomJS driver for Capybara
225 225 gem 'poltergeist', '~> 1.5.1'
226 226  
227   - gem 'jasmine', '2.0.0.rc5'
  227 + gem 'jasmine', '2.0.2'
228 228  
229 229 gem "spring", '1.1.1'
230 230 gem "spring-commands-rspec", '1.0.1'
... ...
Gemfile.lock
... ... @@ -2,37 +2,39 @@ GEM
2 2 remote: https://rubygems.org/
3 3 specs:
4 4 ace-rails-ap (2.0.1)
5   - actionmailer (4.0.5)
6   - actionpack (= 4.0.5)
  5 + actionmailer (4.1.1)
  6 + actionpack (= 4.1.1)
  7 + actionview (= 4.1.1)
7 8 mail (~> 2.5.4)
8   - actionpack (4.0.5)
9   - activesupport (= 4.0.5)
10   - builder (~> 3.1.0)
11   - erubis (~> 2.7.0)
  9 + actionpack (4.1.1)
  10 + actionview (= 4.1.1)
  11 + activesupport (= 4.1.1)
12 12 rack (~> 1.5.2)
13 13 rack-test (~> 0.6.2)
14   - activemodel (4.0.5)
15   - activesupport (= 4.0.5)
16   - builder (~> 3.1.0)
17   - activerecord (4.0.5)
18   - activemodel (= 4.0.5)
19   - activerecord-deprecated_finders (~> 1.0.2)
20   - activesupport (= 4.0.5)
21   - arel (~> 4.0.0)
22   - activerecord-deprecated_finders (1.0.3)
23   - activesupport (4.0.5)
  14 + actionview (4.1.1)
  15 + activesupport (= 4.1.1)
  16 + builder (~> 3.1)
  17 + erubis (~> 2.7.0)
  18 + activemodel (4.1.1)
  19 + activesupport (= 4.1.1)
  20 + builder (~> 3.1)
  21 + activerecord (4.1.1)
  22 + activemodel (= 4.1.1)
  23 + activesupport (= 4.1.1)
  24 + arel (~> 5.0.0)
  25 + activesupport (4.1.1)
24 26 i18n (~> 0.6, >= 0.6.9)
25   - minitest (~> 4.2)
26   - multi_json (~> 1.3)
  27 + json (~> 1.7, >= 1.7.7)
  28 + minitest (~> 5.1)
27 29 thread_safe (~> 0.1)
28   - tzinfo (~> 0.3.37)
  30 + tzinfo (~> 1.1)
29 31 acts-as-taggable-on (2.4.1)
30 32 rails (>= 3, < 5)
31 33 addressable (2.3.5)
32 34 annotate (2.6.0)
33 35 activerecord (>= 2.3.0)
34 36 rake (>= 0.8.7)
35   - arel (4.0.2)
  37 + arel (5.0.1.20140414130214)
36 38 asciidoctor (0.1.4)
37 39 awesome_print (1.2.0)
38 40 axiom-types (0.0.5)
... ... @@ -46,7 +48,7 @@ GEM
46 48 debug_inspector (>= 0.0.1)
47 49 bootstrap-sass (3.0.3.0)
48 50 sass (~> 3.2)
49   - builder (3.1.4)
  51 + builder (3.2.2)
50 52 capybara (2.2.1)
51 53 mime-types (>= 1.16)
52 54 nokogiri (>= 1.3.3)
... ... @@ -223,13 +225,13 @@ GEM
223 225 guard-spinach (0.0.2)
224 226 guard (>= 1.1)
225 227 spinach
226   - haml (4.0.4)
  228 + haml (4.0.5)
227 229 tilt
228   - haml-rails (0.5.1)
229   - actionpack (~> 4.0.0)
230   - activesupport (~> 4.0.0)
  230 + haml-rails (0.5.3)
  231 + actionpack (>= 4.0.1)
  232 + activesupport (>= 4.0.1)
231 233 haml (>= 3.1, < 5.0)
232   - railties (~> 4.0.0)
  234 + railties (>= 4.0.1)
233 235 hashie (2.0.5)
234 236 hike (1.2.3)
235 237 hipchat (0.14.0)
... ... @@ -242,12 +244,12 @@ GEM
242 244 httpauth (0.2.0)
243 245 i18n (0.6.9)
244 246 ice_nine (0.10.0)
245   - jasmine (2.0.0.rc5)
246   - jasmine-core (~> 2.0.0.rc5)
  247 + jasmine (2.0.2)
  248 + jasmine-core (~> 2.0.0)
247 249 phantomjs
248 250 rack (>= 1.2.1)
249 251 rake
250   - jasmine-core (2.0.0.rc5)
  252 + jasmine-core (2.0.0)
251 253 jquery-atwho-rails (0.3.3)
252 254 jquery-rails (3.1.0)
253 255 railties (>= 3.0, < 5.0)
... ... @@ -282,11 +284,11 @@ GEM
282 284 method_source (0.8.2)
283 285 mime-types (1.25.1)
284 286 mini_portile (0.6.0)
285   - minitest (4.7.5)
  287 + minitest (5.3.4)
286 288 multi_json (1.10.1)
287 289 multi_xml (0.5.5)
288 290 multipart-post (1.2.0)
289   - mysql2 (0.3.11)
  291 + mysql2 (0.3.16)
290 292 net-ldap (0.3.1)
291 293 net-scp (1.1.2)
292 294 net-ssh (>= 2.6.5)
... ... @@ -355,14 +357,16 @@ GEM
355 357 rack
356 358 rack-test (0.6.2)
357 359 rack (>= 1.0)
358   - rails (4.0.5)
359   - actionmailer (= 4.0.5)
360   - actionpack (= 4.0.5)
361   - activerecord (= 4.0.5)
362   - activesupport (= 4.0.5)
  360 + rails (4.1.1)
  361 + actionmailer (= 4.1.1)
  362 + actionpack (= 4.1.1)
  363 + actionview (= 4.1.1)
  364 + activemodel (= 4.1.1)
  365 + activerecord (= 4.1.1)
  366 + activesupport (= 4.1.1)
363 367 bundler (>= 1.3.0, < 2.0)
364   - railties (= 4.0.5)
365   - sprockets-rails (~> 2.0.0)
  368 + railties (= 4.1.1)
  369 + sprockets-rails (~> 2.0)
366 370 rails-observers (0.1.2)
367 371 activemodel (~> 4.0)
368 372 rails_best_practices (1.14.4)
... ... @@ -374,13 +378,13 @@ GEM
374 378 i18n
375 379 require_all
376 380 ruby-progressbar
377   - railties (4.0.5)
378   - actionpack (= 4.0.5)
379   - activesupport (= 4.0.5)
  381 + railties (4.1.1)
  382 + actionpack (= 4.1.1)
  383 + activesupport (= 4.1.1)
380 384 rake (>= 0.8.7)
381 385 thor (>= 0.18.1, < 2.0)
382 386 raindrops (0.12.0)
383   - rake (10.3.1)
  387 + rake (10.3.2)
384 388 raphael-rails (2.1.2)
385 389 rb-fsevent (0.9.3)
386 390 rb-inotify (0.9.2)
... ... @@ -443,9 +447,9 @@ GEM
443 447 sdoc (0.3.20)
444 448 json (>= 1.1.3)
445 449 rdoc (~> 3.10)
446   - seed-fu (2.3.0)
447   - activerecord (>= 3.1, < 4.1)
448   - activesupport (>= 3.1, < 4.1)
  450 + seed-fu (2.3.1)
  451 + activerecord (>= 3.1, < 4.2)
  452 + activesupport (>= 3.1, < 4.2)
449 453 select2-rails (3.5.2)
450 454 thor (~> 0.14)
451 455 settingslogic (2.0.9)
... ... @@ -491,7 +495,7 @@ GEM
491 495 multi_json (~> 1.0)
492 496 rack (~> 1.0)
493 497 tilt (~> 1.1, != 1.3.0)
494   - sprockets-rails (2.0.1)
  498 + sprockets-rails (2.1.3)
495 499 actionpack (>= 3.0)
496 500 activesupport (>= 3.0)
497 501 sprockets (~> 2.8)
... ... @@ -510,7 +514,7 @@ GEM
510 514 eventmachine (>= 1.0.0)
511 515 rack (>= 1.0.0)
512 516 thor (0.19.1)
513   - thread_safe (0.3.3)
  517 + thread_safe (0.3.4)
514 518 tilt (1.4.1)
515 519 timers (1.1.0)
516 520 tinder (1.9.3)
... ... @@ -532,7 +536,8 @@ GEM
532 536 eventmachine (>= 0.12.8)
533 537 http_parser.rb (~> 0.5.1)
534 538 simple_oauth (~> 0.1.4)
535   - tzinfo (0.3.39)
  539 + tzinfo (1.2.0)
  540 + thread_safe (~> 0.1)
536 541 uglifier (2.3.2)
537 542 execjs (>= 0.3.0)
538 543 json (>= 1.8.0)
... ... @@ -612,7 +617,7 @@ DEPENDENCIES
612 617 haml-rails
613 618 hipchat (~> 0.14.0)
614 619 httparty
615   - jasmine (= 2.0.0.rc5)
  620 + jasmine (= 2.0.2)
616 621 jquery-atwho-rails (~> 0.3.3)
617 622 jquery-rails
618 623 jquery-scrollto-rails
... ... @@ -621,7 +626,7 @@ DEPENDENCIES
621 626 kaminari (~> 0.15.1)
622 627 launchy
623 628 letter_opener
624   - minitest (~> 4.7.0)
  629 + minitest (~> 5.3.0)
625 630 mysql2
626 631 nprogress-rails
627 632 omniauth (~> 1.1.3)
... ... @@ -637,7 +642,7 @@ DEPENDENCIES
637 642 rack-attack
638 643 rack-cors
639 644 rack-mini-profiler
640   - rails (~> 4.0.0)
  645 + rails (~> 4.1.0)
641 646 rails-observers
642 647 rails_best_practices
643 648 raphael-rails (~> 2.1.2)
... ...
app/controllers/projects_controller.rb
... ... @@ -211,6 +211,6 @@ class ProjectsController &lt; ApplicationController
211 211 end
212 212  
213 213 def sorted(users)
214   - users.uniq.compact.sort_by(&:username).map { |user| { username: user.username, name: user.name } }
  214 + users.uniq.to_a.compact.sort_by(&:username).map { |user| { username: user.username, name: user.name } }
215 215 end
216 216 end
... ...
app/controllers/snippets_controller.rb
... ... @@ -14,7 +14,7 @@ class SnippetsController &lt; ApplicationController
14 14 layout 'navless'
15 15  
16 16 def index
17   - @snippets = Snippet.public.fresh.non_expired.page(params[:page]).per(20)
  17 + @snippets = Snippet.are_public.fresh.non_expired.page(params[:page]).per(20)
18 18 end
19 19  
20 20 def user_index
... ... @@ -26,15 +26,15 @@ class SnippetsController &lt; ApplicationController
26 26  
27 27 if @user == current_user
28 28 @snippets = case params[:scope]
29   - when 'public' then
30   - @snippets.public
31   - when 'private' then
32   - @snippets.private
  29 + when 'are_public' then
  30 + @snippets.are_public
  31 + when 'are_private' then
  32 + @snippets.are_private
33 33 else
34 34 @snippets
35 35 end
36 36 else
37   - @snippets = @snippets.public
  37 + @snippets = @snippets.are_public
38 38 end
39 39  
40 40 @snippets = @snippets.page(params[:page]).per(20)
... ...
app/models/snippet.rb
... ... @@ -34,8 +34,8 @@ class Snippet &lt; ActiveRecord::Base
34 34 validates :content, presence: true
35 35  
36 36 # Scopes
37   - scope :public, -> { where(private: false) }
38   - scope :private, -> { where(private: true) }
  37 + scope :are_public, -> { where(private: false) }
  38 + scope :are_private, -> { where(private: true) }
39 39 scope :fresh, -> { order("created_at DESC") }
40 40 scope :expired, -> { where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) }
41 41 scope :non_expired, -> { where(["expires_at IS NULL OR expires_at > ?", Time.current]) }
... ...
app/views/snippets/current_user_index.html.haml
... ... @@ -18,16 +18,16 @@
18 18 All
19 19 %span.pull-right
20 20 = @user.snippets.count
21   - = nav_tab :scope, 'private' do
22   - = link_to user_snippets_path(@user, scope: 'private') do
  21 + = nav_tab :scope, 'are_private' do
  22 + = link_to user_snippets_path(@user, scope: 'are_private') do
23 23 Private
24 24 %span.pull-right
25   - = @user.snippets.private.count
26   - = nav_tab :scope, 'public' do
27   - = link_to user_snippets_path(@user, scope: 'public') do
  25 + = @user.snippets.are_private.count
  26 + = nav_tab :scope, 'are_public' do
  27 + = link_to user_snippets_path(@user, scope: 'are_public') do
28 28 Public
29 29 %span.pull-right
30   - = @user.snippets.public.count
  30 + = @user.snippets.are_public.count
31 31  
32 32 .col-md-9.my-snippets
33 33 = render 'snippets'
... ...
config/environments/production.rb
... ... @@ -74,10 +74,6 @@ Gitlab::Application.configure do
74 74 # Send deprecation notices to registered listeners
75 75 config.active_support.deprecation = :notify
76 76  
77   - # Log the query plan for queries taking more than this (works
78   - # with SQLite, MySQL, and PostgreSQL)
79   - # config.active_record.auto_explain_threshold_in_seconds = 0.5
80   -
81 77 config.action_mailer.delivery_method = :sendmail
82 78 # Defaults to:
83 79 # # config.action_mailer.sendmail_settings = {
... ...
config/initializers/acts_as_taggable_on_patch.rb 0 → 100644
... ... @@ -0,0 +1,130 @@
  1 +# This is a patch to address the issue in https://github.com/mbleigh/acts-as-taggable-on/issues/427 caused by
  2 +# https://github.com/rails/rails/commit/31a43ebc107fbd50e7e62567e5208a05909ec76c
  3 +# gem 'acts-as-taggable-on' has the fix included https://github.com/mbleigh/acts-as-taggable-on/commit/89bbed3864a9252276fb8dd7d535fce280454b90
  4 +# but not in the currently used version of gem ('2.4.1')
  5 +# With replacement of 'acts-as-taggable-on' gem this file will become obsolete
  6 +
  7 +module ActsAsTaggableOn::Taggable
  8 + module Core
  9 + module ClassMethods
  10 + def tagged_with(tags, options = {})
  11 + tag_list = ActsAsTaggableOn::TagList.from(tags)
  12 + empty_result = where("1 = 0")
  13 +
  14 + return empty_result if tag_list.empty?
  15 +
  16 + joins = []
  17 + conditions = []
  18 + having = []
  19 + select_clause = []
  20 +
  21 + context = options.delete(:on)
  22 + owned_by = options.delete(:owned_by)
  23 + alias_base_name = undecorated_table_name.gsub('.','_')
  24 + quote = ActsAsTaggableOn::Tag.using_postgresql? ? '"' : ''
  25 +
  26 + if options.delete(:exclude)
  27 + if options.delete(:wild)
  28 + tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name #{like_operator} ? ESCAPE '!'", "%#{escape_like(t)}%"]) }.join(" OR ")
  29 + else
  30 + tags_conditions = tag_list.map { |t| sanitize_sql(["#{ActsAsTaggableOn::Tag.table_name}.name #{like_operator} ?", t]) }.join(" OR ")
  31 + end
  32 +
  33 + conditions << "#{table_name}.#{primary_key} NOT IN (SELECT #{ActsAsTaggableOn::Tagging.table_name}.taggable_id FROM #{ActsAsTaggableOn::Tagging.table_name} JOIN #{ActsAsTaggableOn::Tag.table_name} ON #{ActsAsTaggableOn::Tagging.table_name}.tag_id = #{ActsAsTaggableOn::Tag.table_name}.#{ActsAsTaggableOn::Tag.primary_key} AND (#{tags_conditions}) WHERE #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name, nil)})"
  34 +
  35 + if owned_by
  36 + joins << "JOIN #{ActsAsTaggableOn::Tagging.table_name}" +
  37 + " ON #{ActsAsTaggableOn::Tagging.table_name}.taggable_id = #{quote}#{table_name}#{quote}.#{primary_key}" +
  38 + " AND #{ActsAsTaggableOn::Tagging.table_name}.taggable_type = #{quote_value(base_class.name, nil)}" +
  39 + " AND #{ActsAsTaggableOn::Tagging.table_name}.tagger_id = #{owned_by.id}" +
  40 + " AND #{ActsAsTaggableOn::Tagging.table_name}.tagger_type = #{quote_value(owned_by.class.base_class.to_s, nil)}"
  41 + end
  42 +
  43 + elsif options.delete(:any)
  44 + # get tags, drop out if nothing returned (we need at least one)
  45 + tags = if options.delete(:wild)
  46 + ActsAsTaggableOn::Tag.named_like_any(tag_list)
  47 + else
  48 + ActsAsTaggableOn::Tag.named_any(tag_list)
  49 + end
  50 +
  51 + return empty_result unless tags.length > 0
  52 +
  53 + # setup taggings alias so we can chain, ex: items_locations_taggings_awesome_cool_123
  54 + # avoid ambiguous column name
  55 + taggings_context = context ? "_#{context}" : ''
  56 +
  57 + taggings_alias = adjust_taggings_alias(
  58 + "#{alias_base_name[0..4]}#{taggings_context[0..6]}_taggings_#{sha_prefix(tags.map(&:name).join('_'))}"
  59 + )
  60 +
  61 + tagging_join = "JOIN #{ActsAsTaggableOn::Tagging.table_name} #{taggings_alias}" +
  62 + " ON #{taggings_alias}.taggable_id = #{quote}#{table_name}#{quote}.#{primary_key}" +
  63 + " AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name, nil)}"
  64 + tagging_join << " AND " + sanitize_sql(["#{taggings_alias}.context = ?", context.to_s]) if context
  65 +
  66 + # don't need to sanitize sql, map all ids and join with OR logic
  67 + conditions << tags.map { |t| "#{taggings_alias}.tag_id = #{t.id}" }.join(" OR ")
  68 + select_clause = "DISTINCT #{table_name}.*" unless context and tag_types.one?
  69 +
  70 + if owned_by
  71 + tagging_join << " AND " +
  72 + sanitize_sql([
  73 + "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?",
  74 + owned_by.id,
  75 + owned_by.class.base_class.to_s
  76 + ])
  77 + end
  78 +
  79 + joins << tagging_join
  80 + else
  81 + tags = ActsAsTaggableOn::Tag.named_any(tag_list)
  82 +
  83 + return empty_result unless tags.length == tag_list.length
  84 +
  85 + tags.each do |tag|
  86 + taggings_alias = adjust_taggings_alias("#{alias_base_name[0..11]}_taggings_#{sha_prefix(tag.name)}")
  87 + tagging_join = "JOIN #{ActsAsTaggableOn::Tagging.table_name} #{taggings_alias}" +
  88 + " ON #{taggings_alias}.taggable_id = #{quote}#{table_name}#{quote}.#{primary_key}" +
  89 + " AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name, nil)}" +
  90 + " AND #{taggings_alias}.tag_id = #{tag.id}"
  91 +
  92 + tagging_join << " AND " + sanitize_sql(["#{taggings_alias}.context = ?", context.to_s]) if context
  93 +
  94 + if owned_by
  95 + tagging_join << " AND " +
  96 + sanitize_sql([
  97 + "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?",
  98 + owned_by.id,
  99 + owned_by.class.base_class.to_s
  100 + ])
  101 + end
  102 +
  103 + joins << tagging_join
  104 + end
  105 + end
  106 +
  107 + taggings_alias, tags_alias = adjust_taggings_alias("#{alias_base_name}_taggings_group"), "#{alias_base_name}_tags_group"
  108 +
  109 + if options.delete(:match_all)
  110 + joins << "LEFT OUTER JOIN #{ActsAsTaggableOn::Tagging.table_name} #{taggings_alias}" +
  111 + " ON #{taggings_alias}.taggable_id = #{quote}#{table_name}#{quote}.#{primary_key}" +
  112 + " AND #{taggings_alias}.taggable_type = #{quote_value(base_class.name, nil)}"
  113 +
  114 +
  115 + group_columns = ActsAsTaggableOn::Tag.using_postgresql? ? grouped_column_names_for(self) : "#{table_name}.#{primary_key}"
  116 + group = group_columns
  117 + having = "COUNT(#{taggings_alias}.taggable_id) = #{tags.size}"
  118 + end
  119 +
  120 + select(select_clause) \
  121 + .joins(joins.join(" ")) \
  122 + .where(conditions.join(" AND ")) \
  123 + .group(group) \
  124 + .having(having) \
  125 + .order(options[:order]) \
  126 + .readonly(false)
  127 + end
  128 + end
  129 + end
  130 +end
... ...
config/initializers/state_machine_patch.rb 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +# This is a patch to address the issue in https://github.com/pluginaweek/state_machine/issues/251
  2 +# where gem 'state_machine' was not working for Rails 4.1
  3 +module StateMachine
  4 + module Integrations
  5 + module ActiveModel
  6 + public :around_validation
  7 + end
  8 + end
  9 +end
... ...
spec/helpers/submodule_helper_spec.rb
... ... @@ -16,7 +16,8 @@ describe SubmoduleHelper do
16 16 end
17 17  
18 18 it 'should detect ssh on standard port' do
19   - Gitlab.config.gitlab.stub(ssh_port: 22) # set this just to be sure
  19 + Gitlab.config.gitlab_shell.stub(ssh_port: 22) # set this just to be sure
  20 + Gitlab.config.gitlab_shell.stub(ssh_path_prefix: Settings.send(:build_gitlab_shell_ssh_path_prefix))
20 21 stub_url([ config.user, '@', config.host, ':gitlab-org/gitlab-ce.git' ].join(''))
21 22 submodule_links(submodule_item).should == [ project_path('gitlab-org/gitlab-ce'), project_tree_path('gitlab-org/gitlab-ce', 'hash') ]
22 23 end
... ...
spec/models/system_hook_spec.rb
... ... @@ -59,7 +59,7 @@ describe SystemHook do
59 59 user = create(:user)
60 60 project = create(:project)
61 61 project.team << [user, :master]
62   - project.users_projects.clear
  62 + project.users_projects.destroy_all
63 63 WebMock.should have_requested(:post, @system_hook.url).with(body: /user_remove_from_team/).once
64 64 end
65 65 end
... ...