diff --git a/app/models/changeset.rb b/app/models/changeset.rb index ea3d61d..70df745 100755 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -119,10 +119,28 @@ class Changeset < ActiveRecord::Base ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) ref_keywords_any = ref_keywords.delete('*') # 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("|") - + #fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip) + + ref_updates = + [ { :keywords => Setting.commit_update1_keywords.downcase.split(",").collect(&:strip), + :status_id => Setting.commit_update1_status_id, + :done_ratio => Setting.commit_update1_done_ratio }, + { :keywords => Setting.commit_update2_keywords.downcase.split(",").collect(&:strip), + :status_id => Setting.commit_update2_status_id, + :done_ratio => Setting.commit_update2_done_ratio }, + { :keywords => Setting.commit_update3_keywords.downcase.split(",").collect(&:strip), + :status_id => Setting.commit_update3_status_id, + :done_ratio => Setting.commit_update3_done_ratio }, + { :keywords => Setting.commit_update4_keywords.downcase.split(",").collect(&:strip), + :status_id => Setting.commit_update4_status_id, + :done_ratio => Setting.commit_update4_done_ratio }, + { :keywords => Setting.commit_update5_keywords.downcase.split(",").collect(&:strip), + :status_id => Setting.commit_update5_status_id, + :done_ratio => Setting.commit_update5_done_ratio } ] + + #kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") + kw_regexp = (ref_keywords + ref_updates.collect{|u| u[:keywords]}.flatten).collect{|kw| Regexp.escape(kw)}.join("|") + referenced_issues = [] comments.scan(/([\s\(\[,-]|^)((#{kw_regexp})[\s:]+)?(#\d+(\s+@#{TIMELOG_RE})?([\s,;&]+#\d+(\s+@#{TIMELOG_RE})?)*)(?=[[:punct:]]|\s|<|$)/i) do |match| @@ -132,8 +150,14 @@ class Changeset < ActiveRecord::Base refs.scan(/#(\d+)(\s+@#{TIMELOG_RE})?/).each do |m| issue, hours = find_referenced_issue_by_id(m[0].to_i), m[2] if issue + #referenced_issues << issue + #fix_issue(issue) if fix_keywords.include?(action.to_s.downcase) + referenced_issues << issue - fix_issue(issue) if fix_keywords.include?(action.to_s.downcase) + ref_updates.each do |u| + update_issue(issue, u[:status_id], u[:done_ratio]) if u[:keywords].include?(action.to_s.downcase) + end + log_time(issue, hours) if hours && Setting.commit_logtime_enabled? end end @@ -217,10 +241,13 @@ class Changeset < ActiveRecord::Base private - def fix_issue(issue) - status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) + #def fix_issue(issue) + # status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) + def update_issue(issue, status_id, done_ratio) + status = IssueStatus.find_by_id(status_id.to_i) if status.nil? - logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger + #logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger + logger.warn("No status matches commit_update_status_id setting (#{status_id})") if logger return issue end @@ -231,8 +258,10 @@ class Changeset < ActiveRecord::Base journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, text_tag(issue.project))) issue.status = status - unless Setting.commit_fix_done_ratio.blank? - issue.done_ratio = Setting.commit_fix_done_ratio.to_i + #unless Setting.commit_fix_done_ratio.blank? + #issue.done_ratio = Setting.commit_fix_done_ratio.to_i + 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 }) diff --git a/app/views/settings/_repositories.html.erb b/app/views/settings/_repositories.html.erb index 9593a14..97df131 100755 --- a/app/views/settings/_repositories.html.erb +++ b/app/views/settings/_repositories.html.erb @@ -68,17 +68,30 @@

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

<%= setting_check_box :commit_cross_project_ref %>

diff --git a/config/locales/en.yml b/config/locales/en.yml index 6c13393..22fa88d 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -343,7 +343,11 @@ en: setting_autofetch_changesets: Fetch commits automatically 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 @@ -932,7 +936,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 --git a/config/settings.yml b/config/settings.yml index 66bc78e..ab49afa 100755 --- a/config/settings.yml +++ b/config/settings.yml @@ -94,16 +94,50 @@ sys_api_enabled: default: 0 sys_api_key: default: '' +# commit actions commit_cross_project_ref: default: 0 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 commit_logtime_enabled: default: 0