diff -Nrup redmine-1.0.4/app/models/changeset.rb redmine-1.0.4-commit-update/app/models/changeset.rb --- redmine-1.0.4/app/models/changeset.rb 2010-11-28 13:51:00.000000000 -0700 +++ redmine-1.0.4-commit-update/app/models/changeset.rb 2011-01-21 16:31:45.922686700 -0700 @@ -81,12 +81,17 @@ class Changeset < ActiveRecord::Base return if comments.blank? # keywords used to reference issues ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) - # keywords used to fix issues - fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip) - - kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") + + # keywords used to update issues + keywords1 = Setting.commit_update1_keywords.downcase.split(",").collect(&:strip) + keywords2 = Setting.commit_update2_keywords.downcase.split(",").collect(&:strip) + keywords3 = Setting.commit_update3_keywords.downcase.split(",").collect(&:strip) + keywords4 = Setting.commit_update4_keywords.downcase.split(",").collect(&:strip) + keywords5 = Setting.commit_update5_keywords.downcase.split(",").collect(&:strip) + + kw_regexp = (ref_keywords + keywords1 + keywords2 + keywords3 + keywords4 + keywords5).collect{|kw| Regexp.escape(kw)}.join("|") return if kw_regexp.blank? - + referenced_issues = [] if ref_keywords.delete('*') @@ -95,38 +100,53 @@ class Changeset < ActiveRecord::Base comments.scan(%r{([\s\(\[,-]|^)#(\d+)(?=[[:punct:]]|\s|<|$)}).each { |m| target_issue_ids << m[1] } referenced_issues += find_referenced_issues_by_id(target_issue_ids) end - + comments.scan(Regexp.new("(#{kw_regexp})[\s:]+(([\s,;&]*#?\\d+)+)", Regexp::IGNORECASE)).each do |match| action = match[0] target_issue_ids = match[1].scan(/\d+/) target_issues = find_referenced_issues_by_id(target_issue_ids) - if fix_keywords.include?(action.downcase) && fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id) - # update status of issues - logger.debug "Issues fixed by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug? - target_issues.each do |issue| - # the issue may have been updated by the closure of another one (eg. duplicate) - issue.reload - # don't change the status is the issue is closed - next if issue.status.is_closed? - csettext = "r#{self.revision}" - if self.scmid && (! (csettext =~ /^r[0-9]+$/)) - csettext = "commit:\"#{self.scmid}\"" - end - journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, csettext)) - issue.status = fix_status - unless Setting.commit_fix_done_ratio.blank? - issue.done_ratio = Setting.commit_fix_done_ratio.to_i - end - Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, - { :changeset => self, :issue => issue }) - issue.save - end - end + + update_issue_id(action, target_issues, target_issue_ids, keywords1, + Setting.commit_update1_status_id, Setting.commit_update1_done_ratio) + update_issue_id(action, target_issues, target_issue_ids, keywords2, + Setting.commit_update2_status_id, Setting.commit_update2_done_ratio) + update_issue_id(action, target_issues, target_issue_ids, keywords3, + Setting.commit_update3_status_id, Setting.commit_update3_done_ratio) + update_issue_id(action, target_issues, target_issue_ids, keywords4, + Setting.commit_update4_status_id, Setting.commit_update4_done_ratio) + update_issue_id(action, target_issues, target_issue_ids, keywords5, + Setting.commit_update5_status_id, Setting.commit_update5_done_ratio) + referenced_issues += target_issues end - + referenced_issues.uniq! self.issues = referenced_issues unless referenced_issues.empty? + end + + def update_issue_id(action, issues, issue_ids, keywords, status_id, done_ratio) + if keywords.include?(action.downcase) && new_status = IssueStatus.find_by_id(status_id) + # update status of issues + logger.debug "Issues #{new_status.downcase} by changeset #{self.revision}: #{issue_ids.join(', ')}." if logger && logger.debug? + issues.each do |issue| + # the issue may have been updated by the closure of another one (eg. duplicate) + issue.reload + # don't change the status if the issue is closed + next if issue.status.is_closed? + csettext = "r#{self.revision}" + if self.scmid && (! (csettext =~ /^r[0-9]+$/)) + csettext = "commit:\"#{self.scmid}\"" + end + journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, csettext)) + issue.status = new_status + unless done_ratio.blank? + issue.done_ratio = done_ratio.to_i + end + Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, + { :changeset => self, :issue => issue }) + issue.save + end + end end def short_comments diff -Nrup redmine-1.0.4/app/views/settings/_repositories.rhtml redmine-1.0.4-commit-update/app/views/settings/_repositories.rhtml --- redmine-1.0.4/app/views/settings/_repositories.rhtml 2010-11-28 13:51:00.000000000 -0700 +++ redmine-1.0.4-commit-update/app/views/settings/_repositories.rhtml 2011-01-21 16:31:45.938311700 -0700 @@ -27,10 +27,31 @@
<%= setting_text_field :commit_ref_keywords, :size => 30 %>
<%= l(:text_comma_separated) %>
<%= setting_text_field :commit_fix_keywords, :size => 30 %> - <%= l(:label_applied_status) %>: <%= setting_select :commit_fix_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %> - <%= l(:field_done_ratio) %>: <%= setting_select :commit_fix_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %> +
<%= setting_text_field :commit_update1_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= setting_select :commit_update1_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %>
+ <%= l(:field_done_ratio) %>: <%= setting_select :commit_update1_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %>
<%= l(:text_comma_separated) %>
<%= setting_text_field :commit_update2_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= setting_select :commit_update2_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %>
+ <%= l(:field_done_ratio) %>: <%= setting_select :commit_update2_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %>
+
<%= l(:text_comma_separated) %>
<%= setting_text_field :commit_update3_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= setting_select :commit_update3_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %>
+ <%= l(:field_done_ratio) %>: <%= setting_select :commit_update3_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %>
+
<%= l(:text_comma_separated) %>
<%= setting_text_field :commit_update4_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= setting_select :commit_update4_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %>
+ <%= l(:field_done_ratio) %>: <%= setting_select :commit_update4_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %>
+
<%= l(:text_comma_separated) %>
<%= setting_text_field :commit_update5_keywords, :size => 30 %>
+ <%= l(:label_applied_status) %>: <%= setting_select :commit_update5_status_id, [["", 0]] + IssueStatus.find(:all).collect{|status| [status.name, status.id.to_s]}, :label => false %>
+ <%= l(:field_done_ratio) %>: <%= setting_select :commit_update5_done_ratio, (0..10).to_a.collect {|r| ["#{r*10} %", "#{r*10}"] }, :blank => :label_no_change_option, :label => false %>
+
<%= l(:text_comma_separated) %>