From d80fb751fd01bb2bcc9bb3cbc3254992678f970d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 28 Feb 2010 10:10:55 +0000 Subject: [PATCH] Merged r3469, r3472 and r3473 from trunk. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/0.9-stable@3505 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/changeset.rb | 13 +++++++------ app/models/repository.rb | 13 ++++++++++--- lib/redmine/scm/adapters/abstract_adapter.rb | 20 +++++++++++--------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/app/models/changeset.rb b/app/models/changeset.rb index fcd7bb122..4f6300381 100644 --- a/app/models/changeset.rb +++ b/app/models/changeset.rb @@ -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) } diff --git a/app/models/repository.rb b/app/models/repository.rb index da1168dfd..dee705c97 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -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 diff --git a/lib/redmine/scm/adapters/abstract_adapter.rb b/lib/redmine/scm/adapters/abstract_adapter.rb index 962072950..a3ca61e23 100644 --- a/lib/redmine/scm/adapters/abstract_adapter.rb +++ b/lib/redmine/scm/adapters/abstract_adapter.rb @@ -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 -- 2.39.5