diff options
Diffstat (limited to 'app/models/changeset.rb')
-rw-r--r-- | app/models/changeset.rb | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/app/models/changeset.rb b/app/models/changeset.rb index d3fa8ab2b..7920ae078 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -118,21 +118,21 @@ 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) + fix_keywords = Setting.commit_update_by_keyword.keys kw_regexp = (ref_keywords + fix_keywords).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| - action, refs = match[2], match[3] + action, refs = match[2].to_s.downcase, match[3] next unless action.present? || ref_keywords_any 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) + fix_issue(issue, action) if fix_keywords.include?(action) log_time(issue, hours) if hours && Setting.commit_logtime_enabled? end end @@ -210,12 +210,10 @@ class Changeset < ActiveRecord::Base private - def fix_issue(issue) - status = IssueStatus.find_by_id(Setting.commit_fix_status_id.to_i) - if status.nil? - logger.warn("No status matches commit_fix_status_id setting (#{Setting.commit_fix_status_id})") if logger - return issue - end + # Updates the +issue+ according to +action+ + def fix_issue(issue, action) + updates = Setting.commit_update_by_keyword[action] + return unless updates.is_a?(Hash) # the issue may have been updated by the closure of another one (eg. duplicate) issue.reload @@ -223,10 +221,7 @@ class Changeset < ActiveRecord::Base return if issue.status && issue.status.is_closed? 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 - end + issue.assign_attributes updates.slice(*Issue.attribute_names) Redmine::Hook.call_hook(:model_changeset_scan_commit_for_issue_ids_pre_issue_update, { :changeset => self, :issue => issue }) unless issue.save |