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) %>

+ <%= submit_tag l(:button_save) %> diff -Nrup redmine-1.0.4/config/locales/en.yml redmine-1.0.4-commit-update/config/locales/en.yml --- redmine-1.0.4/config/locales/en.yml 2010-11-28 13:52:00.000000000 -0700 +++ redmine-1.0.4-commit-update/config/locales/en.yml 2011-01-21 16:31:45.953936700 -0700 @@ -316,7 +316,11 @@ en: setting_autofetch_changesets: Autofetch commits setting_sys_api_enabled: Enable WS for repository management setting_commit_ref_keywords: Referencing keywords - setting_commit_fix_keywords: Fixing keywords + setting_commit_update1_keywords: Keywords + setting_commit_update2_keywords: Keywords + setting_commit_update3_keywords: Keywords + setting_commit_update4_keywords: Keywords + setting_commit_update5_keywords: Keywords setting_autologin: Autologin setting_date_format: Date format setting_time_format: Time format @@ -857,7 +861,7 @@ en: text_unallowed_characters: Unallowed characters text_comma_separated: Multiple values allowed (comma separated). text_line_separated: Multiple values allowed (one line for each value). - text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages + text_issues_ref_in_commit_messages: Referencing and updating issues in commit messages text_issue_added: "Issue {{id}} has been reported by {{author}}." text_issue_updated: "Issue {{id}} has been updated by {{author}}." text_wiki_destroy_confirmation: Are you sure you want to delete this wiki and all its content ? diff -Nrup redmine-1.0.4/config/settings.yml redmine-1.0.4-commit-update/config/settings.yml --- redmine-1.0.4/config/settings.yml 2010-11-28 13:52:00.000000000 -0700 +++ redmine-1.0.4-commit-update/config/settings.yml 2011-01-21 16:31:45.969561700 -0700 @@ -89,14 +89,48 @@ sys_api_enabled: default: 0 sys_api_key: default: '' +# commit actions commit_ref_keywords: default: 'refs,references,IssueID' -commit_fix_keywords: +# commit update 1 +commit_update1_keywords: default: 'fixes,closes' -commit_fix_status_id: +commit_update1_status_id: format: int default: 0 -commit_fix_done_ratio: +commit_update1_done_ratio: + default: 100 +# commit update 2 +commit_update2_keywords: + default: '' +commit_update2_status_id: + format: int + default: 0 +commit_update2_done_ratio: + default: 100 +# commit update 3 +commit_update3_keywords: + default: '' +commit_update3_status_id: + format: int + default: 0 +commit_update3_done_ratio: + default: 100 +# commitupdate 4 +commit_update4_keywords: + default: '' +commit_update4_status_id: + format: int + default: 0 +commit_update4_done_ratio: + default: 100 +# commit update 5 +commit_update5_keywords: + default: '' +commit_update5_status_id: + format: int + default: 0 +commit_update5_done_ratio: default: 100 # autologin duration in days # 0 means autologin is disabled