From 5cc616b75b5081e09e48f939b41d96f1cd985d17 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:41:22 +0000 Subject: [PATCH 1/8] Merged r14049 (#19197). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14056 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/issue.rb | 4 ++-- test/unit/issue_test.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/models/issue.rb b/app/models/issue.rb index 5a49b0d7ba..8777a11f4e 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -819,12 +819,12 @@ def new_statuses_allowed_to(user=User.current, include_default=false) end end - # Returns the previous assignee if changed + # Returns the previous assignee (user or group) if changed def assigned_to_was # assigned_to_id_was is reset before after_save callbacks user_id = @previous_assigned_to_id || assigned_to_id_was if user_id && user_id != assigned_to_id - @assigned_to_was ||= User.find_by_id(user_id) + @assigned_to_was ||= Principal.find_by_id(user_id) end end diff --git a/test/unit/issue_test.rb b/test/unit/issue_test.rb index 33635e7a57..72157e5381 100644 --- a/test/unit/issue_test.rb +++ b/test/unit/issue_test.rb @@ -2591,4 +2591,12 @@ def test_changing_tracker_should_keep_status_if_status_was_not_default_and_is_us issue.tracker = Tracker.find(2) assert_equal IssueStatus.find(3), issue.status end + + def test_assigned_to_was_with_a_group + group = Group.find(10) + + issue = Issue.generate!(:assigned_to => group) + issue.reload.assigned_to = nil + assert_equal group, issue.assigned_to_was + end end From 36b70437e0fc86e4c625ae58b1ec85bb26c12ea9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:42:45 +0000 Subject: [PATCH 2/8] Merged r14050 (#19260). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14058 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/repository.rb | 1 - test/unit/repository_git_test.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/models/repository.rb b/app/models/repository.rb index 92dd55d5ae..21e97bb6e8 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -38,7 +38,6 @@ class Repository < ActiveRecord::Base validates_length_of :password, :maximum => 255, :allow_nil => true validates_length_of :identifier, :maximum => IDENTIFIER_MAX_LENGTH, :allow_blank => true - validates_presence_of :identifier, :unless => Proc.new { |r| r.is_default? || r.set_as_default? } validates_uniqueness_of :identifier, :scope => :project_id, :allow_blank => true validates_exclusion_of :identifier, :in => %w(browse show entry raw changes annotate diff statistics graph revisions revision) # donwcase letters, digits, dashes, underscores but not digits only diff --git a/test/unit/repository_git_test.rb b/test/unit/repository_git_test.rb index cf1ae08267..be5726b81a 100644 --- a/test/unit/repository_git_test.rb +++ b/test/unit/repository_git_test.rb @@ -49,6 +49,35 @@ def setup assert @repository end + def test_nondefault_repo_with_blank_identifier_destruction + repo1 = Repository::Git.new( + :project => @project, + :url => REPOSITORY_PATH, + :identifier => '', + :is_default => true + ) + assert repo1.save + repo1.fetch_changesets + + repo2 = Repository::Git.new( + :project => @project, + :url => REPOSITORY_PATH, + :identifier => 'repo2', + :is_default => true + ) + assert repo2.save + repo2.fetch_changesets + + repo1.reload + repo2.reload + assert !repo1.is_default? + assert repo2.is_default? + + assert_difference 'Repository.count', -1 do + repo1.destroy + end + end + def test_blank_path_to_repository_error_message set_language_if_valid 'en' repo = Repository::Git.new( From d26f61395371c32e4c0a4ef14cc8c991bd517669 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:43:29 +0000 Subject: [PATCH 3/8] Merged r14051 (#19218). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14060 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- config/locales/pt-BR.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index b8305b92c8..bdb1383b41 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -157,7 +157,7 @@ pt-BR: general_text_Yes: 'Sim' general_text_no: 'não' general_text_yes: 'sim' - general_lang_name: 'Português(Brasil)' + general_lang_name: 'Portuguese/Brasil (Português/Brasil)' general_csv_separator: ';' general_csv_decimal_separator: ',' general_csv_encoding: ISO-8859-1 From f4ff617f376eb50f62e46c8bd3be79a8d72ed6ab Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:44:08 +0000 Subject: [PATCH 4/8] Merged r14047 (#19232). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14061 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- lib/redmine/imap.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/redmine/imap.rb b/lib/redmine/imap.rb index 418066632b..d7f2ad636a 100644 --- a/lib/redmine/imap.rb +++ b/lib/redmine/imap.rb @@ -24,7 +24,7 @@ def check(imap_options={}, options={}) host = imap_options[:host] || '127.0.0.1' port = imap_options[:port] || '143' ssl = !imap_options[:ssl].nil? - starttls = !imap_options[:tls].nil? + starttls = !imap_options[:starttls].nil? folder = imap_options[:folder] || 'INBOX' imap = Net::IMAP.new(host, port, ssl) From fc4d0539c0eee6d407735a735f4b88a6d740d48b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:44:46 +0000 Subject: [PATCH 5/8] Merged r14053 (#19253). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14062 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/repositories_controller.rb | 2 +- test/functional/repositories_controller_test.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 6e968f9091..364b834efa 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -92,7 +92,7 @@ def pickup_extra_info def committers @committers = @repository.committers - @users = @project.users + @users = @project.users.to_a additional_user_ids = @committers.collect(&:last).collect(&:to_i) - @users.collect(&:id) @users += User.where(:id => additional_user_ids).to_a unless additional_user_ids.empty? @users.compact! diff --git a/test/functional/repositories_controller_test.rb b/test/functional/repositories_controller_test.rb index 3e0fa59638..056375ca8d 100644 --- a/test/functional/repositories_controller_test.rb +++ b/test/functional/repositories_controller_test.rb @@ -279,6 +279,15 @@ def test_get_committers assert_select 'input[value=foo] + select option[selected=selected]', 0 # no option selected end + def test_get_committers_without_changesets + Changeset.delete_all + @request.session[:user_id] = 2 + + get :committers, :id => 10 + assert_response :success + assert_template 'committers' + end + def test_post_committers @request.session[:user_id] = 2 # add a commit with an unknown user From 735c3ae5c524432a5b99c91d9b0e6a2a6fb99016 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:45:29 +0000 Subject: [PATCH 6/8] Merged r14052 (#19233). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14063 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- db/migrate/20150113213922_remove_users_mail.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/db/migrate/20150113213922_remove_users_mail.rb b/db/migrate/20150113213922_remove_users_mail.rb index 8a8b484294..81bbcf1b7d 100644 --- a/db/migrate/20150113213922_remove_users_mail.rb +++ b/db/migrate/20150113213922_remove_users_mail.rb @@ -4,6 +4,10 @@ def self.up end def self.down - raise IrreversibleMigration + add_column :users, :mail, :string, :limit => 60, :default => '', :null => false + + EmailAddress.where(:is_default => true).each do |a| + User.where(:id => a.user_id).update_all(:mail => a.address) + end end end From 7879d8e4dcb4f2d2bb4e03499a72939c1848c016 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 09:46:21 +0000 Subject: [PATCH 7/8] Merged r14054 (#19225). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14064 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/helpers/issues_helper.rb | 22 +++++++++------ test/unit/helpers/issues_helper_test.rb | 37 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 3870a066df..8e951596cc 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -320,15 +320,19 @@ def details_to_strings(details, no_html=false, options={}) end strings << show_detail(detail, no_html, options) end - values_by_field.each do |field, changes| - detail = JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s) - detail.instance_variable_set "@custom_field", field - if changes[:added].any? - detail.value = changes[:added] - strings << show_detail(detail, no_html, options) - elsif changes[:deleted].any? - detail.old_value = changes[:deleted] - strings << show_detail(detail, no_html, options) + if values_by_field.present? + multiple_values_detail = Struct.new(:property, :prop_key, :custom_field, :old_value, :value) + values_by_field.each do |field, changes| + if changes[:added].any? + detail = multiple_values_detail.new('cf', field.id.to_s, field) + detail.value = changes[:added] + strings << show_detail(detail, no_html, options) + end + if changes[:deleted].any? + detail = multiple_values_detail.new('cf', field.id.to_s, field) + detail.old_value = changes[:deleted] + strings << show_detail(detail, no_html, options) + end end end strings diff --git a/test/unit/helpers/issues_helper_test.rb b/test/unit/helpers/issues_helper_test.rb index b275e75db8..7e9ec0e098 100644 --- a/test/unit/helpers/issues_helper_test.rb +++ b/test/unit/helpers/issues_helper_test.rb @@ -296,6 +296,43 @@ def test_show_detail_relation_deleted_should_not_disclose_issue_that_is_not_visi assert_equal "Precedes deleted (Issue ##{issue.id})", show_detail(detail, false) end + def test_details_to_strings_with_multiple_values_removed_from_custom_field + field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true) + details = [] + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '1', :value => nil) + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '3', :value => nil) + + assert_equal ["User deleted (Dave Lopper, Redmine Admin)"], details_to_strings(details, true) + assert_equal ["User deleted (Dave Lopper, Redmine Admin)"], details_to_strings(details, false) + end + + def test_details_to_strings_with_multiple_values_added_to_custom_field + field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true) + details = [] + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '1') + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '3') + + assert_equal ["User Dave Lopper, Redmine Admin added"], details_to_strings(details, true) + assert_equal ["User Dave Lopper, Redmine Admin added"], details_to_strings(details, false) + end + + def test_details_to_strings_with_multiple_values_added_and_removed_from_custom_field + field = IssueCustomField.generate!(:name => 'User', :field_format => 'user', :multiple => true) + details = [] + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => nil, :value => '1') + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '2', :value => nil) + details << JournalDetail.new(:property => 'cf', :prop_key => field.id.to_s, :old_value => '3', :value => nil) + + assert_equal [ + "User Redmine Admin added", + "User deleted (Dave Lopper, John Smith)" + ], details_to_strings(details, true) + assert_equal [ + "User Redmine Admin added", + "User deleted (Dave Lopper, John Smith)" + ], details_to_strings(details, false) + end + def test_find_name_by_reflection_should_return_nil_for_missing_record assert_nil find_name_by_reflection('status', 99) end From 795bbbec2f2d049c7e0aef7d79326ef44fbdedf9 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 8 Mar 2015 10:37:37 +0000 Subject: [PATCH 8/8] Merged r14065 (#19172). git-svn-id: http://svn.redmine.org/redmine/branches/3.0-stable@14066 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- Gemfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Gemfile b/Gemfile index cc90d69727..96725a370d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,9 @@ source 'https://rubygems.org' +if Gem::Version.new(Bundler::VERSION) < Gem::Version.new('1.5.0') + abort "Redmine requires Bundler 1.5.0 or higher (you're using #{Bundler::VERSION}).\nPlease update with 'gem update bundler'." +end + gem "rails", "4.2.0" gem "jquery-rails", "~> 3.1.1" gem "coderay", "~> 1.1.0"