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?
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|
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
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
# 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)
}
end
end
@committers = nil
+ @found_committer_users = nil
true
else
false
# 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
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