]> source.dussan.org Git - redmine.git/commitdiff
Merged r3469, r3472 and r3473 from trunk.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 28 Feb 2010 10:10:55 +0000 (10:10 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 28 Feb 2010 10:10:55 +0000 (10:10 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3505 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/changeset.rb
app/models/repository.rb
lib/redmine/scm/adapters/abstract_adapter.rb

index fcd7bb122387e4929629ee04b4bcfab7e6883f68..4f6300381d943f83c7059a8763f15aa64f29e215 100644 (file)
@@ -84,9 +84,6 @@ class Changeset < ActiveRecord::Base
     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)
-    # 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)}.join("|")
     return if kw_regexp.blank?
@@ -104,7 +101,7 @@ class Changeset < ActiveRecord::Base
       action = match[0]
       target_issue_ids = match[1].scan(/\d+/)
       target_issues = find_referenced_issues_by_id(target_issue_ids)
-      if fix_status && fix_keywords.include?(action.downcase)
+      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|
@@ -118,7 +115,9 @@ class Changeset < ActiveRecord::Base
           end
           journal = issue.init_journal(user || User.anonymous, ll(Setting.default_language, :text_status_changed_by_changeset, csettext))
           issue.status = fix_status
-          issue.done_ratio = done_ratio if done_ratio
+          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
@@ -127,7 +126,8 @@ class Changeset < ActiveRecord::Base
       referenced_issues += target_issues
     end
     
-    self.issues = referenced_issues.uniq
+    referenced_issues.uniq!
+    self.issues = referenced_issues unless referenced_issues.empty?
   end
   
   def short_comments
@@ -158,6 +158,7 @@ class Changeset < ActiveRecord::Base
   # Finds issues that can be referenced by the commit message
   # i.e. issues that belong to the repository project, a subproject or a parent project
   def find_referenced_issues_by_id(ids)
+    return [] if ids.compact.empty?
     Issue.find_all_by_id(ids, :include => :project).select {|issue|
       project == issue.project || project.is_ancestor_of?(issue.project) || project.is_descendant_of?(issue.project)
     }
index da1168dfd4e28ac454834f43eabf7a8a1e8ac220..dee705c97d3df0306b7a42c6d707e77aaea487fc 100644 (file)
@@ -136,6 +136,7 @@ class Repository < ActiveRecord::Base
         end
       end
       @committers = nil
+      @found_committer_users = nil
       true
     else
       false
@@ -146,16 +147,22 @@ class Repository < ActiveRecord::Base
   # It will return nil if the committer is not yet mapped and if no User
   # with the same username or email was found
   def find_committer_user(committer)
-    if committer
+    unless committer.blank?
+      @found_committer_users ||= {}
+      return @found_committer_users[committer] if @found_committer_users.has_key?(committer)
+      
+      user = nil
       c = changesets.find(:first, :conditions => {:committer => committer}, :include => :user)
       if c && c.user
-        c.user
+        user = c.user
       elsif committer.strip =~ /^([^<]+)(<(.*)>)?$/
         username, email = $1.strip, $3
         u = User.find_by_login(username)
         u ||= User.find_by_mail(email) unless email.blank?
-        u
+        user = u
       end
+      @found_committer_users[committer] = user
+      user
     end
   end
   
index 962072950169e8a09f07bab6ef4a178e22572eeb..a3ca61e2361bad50160f2ac5094d4866ab2dfa58 100644 (file)
@@ -286,21 +286,23 @@ module Redmine
         end
 
         def save(repo)
-          if repo.changesets.find_by_scmid(scmid.to_s).nil?
-            changeset = Changeset.create!(
+          Changeset.transaction do
+            changeset = Changeset.new(
               :repository => repo,
               :revision => identifier,
               :scmid => scmid,
               :committer => author, 
               :committed_on => time,
               :comments => message)
-
-            paths.each do |file|
-              Change.create!(
-                :changeset => changeset,
-                :action => file[:action],
-                :path => file[:path])
-            end   
+            
+            if changeset.save
+              paths.each do |file|
+                Change.create(
+                  :changeset => changeset,
+                  :action => file[:action],
+                  :path => file[:path])
+              end
+            end
           end
         end
       end