diff --git a/app/models/changeset.rb b/app/models/changeset.rb index 21e14fc0d..e4e221732 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -52,19 +52,17 @@ class Changeset < ActiveRecord::Base def scan_comment_for_issue_ids return if comments.blank? # keywords used to reference issues - ref_keywords = Setting.commit_ref_keywords.downcase.split(",") + ref_keywords = Setting.commit_ref_keywords.downcase.split(",").collect(&:strip) # keywords used to fix issues - fix_keywords = Setting.commit_fix_keywords.downcase.split(",") + fix_keywords = Setting.commit_fix_keywords.downcase.split(",").collect(&:strip) # status and optional done ratio applied fix_status = IssueStatus.find_by_id(Setting.commit_fix_status_id) done_ratio = Setting.commit_fix_done_ratio.blank? ? nil : Setting.commit_fix_done_ratio.to_i - kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw.strip)}.join("|") + kw_regexp = (ref_keywords + fix_keywords).collect{|kw| Regexp.escape(kw)}.join("|") return if kw_regexp.blank? - # remove any associated issues - self.issues.clear - + referenced_issues = [] comments.scan(Regexp.new("(#{kw_regexp})[\s:]+(([\s,;&]*#?\\d+)+)", Regexp::IGNORECASE)).each do |match| action = match[0] target_issue_ids = match[1].scan(/\d+/) @@ -80,7 +78,8 @@ class Changeset < ActiveRecord::Base issue.save end end - self.issues << target_issues + referenced_issues += target_issues end + self.issues = referenced_issues.uniq end end diff --git a/test/fixtures/changesets.yml b/test/fixtures/changesets.yml index 1fb8ba64b..3b47eecd8 100644 --- a/test/fixtures/changesets.yml +++ b/test/fixtures/changesets.yml @@ -12,7 +12,7 @@ changesets_002: committed_on: 2007-04-12 15:14:44 +02:00 revision: 2 id: 101 - comments: 'This commit fixes #1, #2 and references #3' + comments: 'This commit fixes #1, #2 and references #1 & #3' repository_id: 10 committer: dlopper changesets_003: diff --git a/test/unit/repository_test.rb b/test/unit/repository_test.rb index ea2122aa7..b802403f5 100644 --- a/test/unit/repository_test.rb +++ b/test/unit/repository_test.rb @@ -40,6 +40,8 @@ class RepositoryTest < Test::Unit::TestCase # choosing a status to apply to fix issues Setting.commit_fix_status_id = IssueStatus.find(:first, :conditions => ["is_closed = ?", true]).id Setting.commit_fix_done_ratio = "90" + Setting.commit_ref_keywords = 'refs , references, IssueID' + Setting.commit_fix_keywords = 'fixes , closes' # make sure issue 1 is not already closed assert !Issue.find(1).status.is_closed?