]> source.dussan.org Git - redmine.git/commitdiff
Commit message parser:
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 22 Oct 2007 16:52:36 +0000 (16:52 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 22 Oct 2007 16:52:36 +0000 (16:52 +0000)
* Fixed: Error when parsing a commit message with duplicate issue identifiers
* Strip referencing and fixing keywords

git-svn-id: http://redmine.rubyforge.org/svn/trunk@861 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/changeset.rb
test/fixtures/changesets.yml
test/unit/repository_test.rb

index 21e14fc0df5c7b7b651ecec27e255f7bb6a627cc..e4e221732b89ac101c2a908dda9f065444e17d1e 100644 (file)
@@ -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
index 1fb8ba64b0289755bf69bbb87e4969aa6501ff44..3b47eecd80590938f05883b71d8d10a8c62bcf83 100644 (file)
@@ -12,7 +12,7 @@ changesets_002:
   committed_on: 2007-04-12 15:14:44 +02:00\r
   revision: 2\r
   id: 101\r
-  comments: 'This commit fixes #1, #2 and references #3'\r
+  comments: 'This commit fixes #1, #2 and references #1 & #3'\r
   repository_id: 10\r
   committer: dlopper\r
 changesets_003: \r
index ea2122aa7a2d0507d0395b0c0446fa498ee4eee2..b802403f547f417645e023d00ad76bf948ee26e4 100644 (file)
@@ -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?